440 votes

Comment formater un long int non signé à l'aide de printf ?

#include <stdio.h>
int main() {
    unsigned long long int num = 285212672; //FYI: fits in 29 bits
    int normalInt = 5;
    printf("My number is %d bytes wide and its value is %ul. A normal number is %d.\n", sizeof(num), num, normalInt);
    return 0;
}

Sortie :

My number is 8 bytes wide and its value is 285212672l. A normal number is 0.

Je suppose que ce résultat inattendu est dû à l'impression du unsigned long long int . Comment faites-vous printf() un unsigned long long int ?

2 votes

Je viens de compiler votre code (avec %llu) avec gcc et la sortie est correcte. Avez-vous passé des options au compilateur ?

2 votes

Notez que la newlib de Samsung Bada ne semble pas supporter "%lld" : developer.bada.com/forum/

1 votes

16voto

Adam Pierce Points 12801

Sous Linux, c'est %llu et dans Windows c'est %I64u

Bien que j'aie constaté qu'il ne fonctionne pas sous Windows 2000, il semble y avoir un bug !

8voto

Sandy Points 74

Compilez-le en x64 avec VS2005 :

%llu fonctionne bien.

6voto

chux Points 13185

Comment formater un unsigned long long int en utilisant printf ?

Comme C99 utilise un "ll" (ell-ell) avant les spécificateurs de conversion o,u,x,X .

En plus des options en base 10 dans de nombreuses réponses, il existe des options en base 16 et en base 8 :

Les choix possibles sont les suivants

unsigned long long num = 285212672;
printf("Base 10: %llu\n", num);
num += 0xFFF; // For more interesting hex/octal output.
printf("Base 16: %llX\n", num); // Use uppercase A-F
printf("Base 16: %llx\n", num); // Use lowercase a-f
printf("Base  8: %llo\n", num);
puts("or 0x,0X prefix");
printf("Base 16: %#llX %#llX\n", num, 0ull); // When non-zero, print leading 0x
printf("Base 16: %#llx %#llx\n", num, 0ull);
printf("Base 16: 0x%llX\n", num); // My hex fave: lower case prefix, with A-F

Sortie

Base 10: 285212672
Base 16: 11000FFF
Base 16: 11000fff
Base  8: 2100007777
or 0x,0X prefix
Base 16: 0X11000FFF 0
Base 16: 0x11000fff 0
Base 16: 0x11000FFF

5voto

7vujy0f0hy Points 1848

Apparemment, personne n'a trouvé de solution multi-plateforme* pour plus d'une décennie depuis [l'] année 2008, alors je vais ajouter le mien . S'il vous plaît upvote. (Je plaisante. Je m'en fiche.)

Solution : lltoa()

Comment l'utiliser :

#include <stdlib.h> /* lltoa() */
// ...
char dummy[255];
printf("Over 4 bytes: %s\n", lltoa(5555555555, dummy, 10));
printf("Another one: %s\n", lltoa(15555555555, dummy, 10));

L'exemple de l'OP :

#include <stdio.h>
#include <stdlib.h> /* lltoa() */

int main() {
    unsigned long long int num = 285212672; // fits in 29 bits
    char dummy[255];
    int normalInt = 5;
    printf("My number is %d bytes wide and its value is %s. "
        "A normal number is %d.\n", 
        sizeof(num), lltoa(num, dummy, 10), normalInt);
    return 0;
}

Contrairement à la %lld imprimer la chaîne de format, celui-ci fonctionne pour moi sous GCC 32 bits sous Windows.

*) Bien, presque multi-plateforme. Dans MSVC, vous avez apparemment besoin de _ui64toa() au lieu de lltoa() .

3voto

eznme Points 13158

En plus de ce que les gens ont écrit il y a des années :

  • vous pourriez obtenir cette erreur avec gcc/mingw :

main.c:30:3: warning: unknown conversion type character 'l' in format [-Wformat=]

printf("%llu\n", k);

Alors votre version de mingw n'est pas par défaut en c99. Ajoutez ce drapeau de compilateur : -std=c99 .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X