Comment imprimez-vous un long long int non signé (le spécificateur de format pour unsigned long long int)?

#include  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 printf() vous printf() un unsigned long long int ?

Utilisez le modificateur long long (el-el) avec la conversion u (non signé). (Fonctionne dans Windows, GNU).

 printf("%llu", 285212672); 

Vous pouvez essayer d’utiliser la bibliothèque inttypes.h qui vous donne des types tels que int32_t , int64_t , uint64_t etc. Vous pouvez ensuite utiliser ses macros telles que:

 uint64_t x; uint32_t y; printf("x: %"PRId64", y: %"PRId32"\n", x, y); 

Ceci est “garanti” de ne pas vous donner le même problème long , unsigned long long etc., puisque vous n’avez pas à deviner combien de bits il y a dans chaque type de données.

Pour long long (ou __int64) utilisant MSVS, vous devez utiliser% I64d:

 __int64 a; time_t b; ... fprintf(outFile,"%I64d,%I64d\n",a,b); //I is capital i 

%d -> pour int

%u -> pour unsigned int

%ld -> pour long int

%lu -> pour unsigned long int

%lld -> pour long long int

%llu -> pour les unsigned long long int

En effet,% llu ne fonctionne pas correctement sous Windows et% d ne peut pas gérer les entiers de 64 bits. Je suggère d’utiliser plutôt PRIu64 et vous verrez qu’il est également portable sur Linux.

Essayez plutôt ceci:

 #include  #include  int main() { unsigned long long int num = 285212672; //FYI: fits in 29 bits int normalInt = 5; /* NOTE: PRIu64 is a preprocessor macro and thus should go outside the quoted ssortingng. */ printf("My number is %d bytes wide and its value is %" PRIu64 ". A normal number is %d.\n", sizeof(num), num, normalInt); return 0; } 

Sortie

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

Sous Linux c’est %llu et dans Windows c’est %I64u

Bien que je trouve que cela ne fonctionne pas dans Windows 2000, il semble y avoir un bogue ici!

Comstackz-le en x64 avec VS2005:

% llu fonctionne bien.

Les choses non standard sont toujours étranges 🙂

pour la longue portion longue sous GNU, c’est L , ll ou q

et sous windows je crois que c’est seulement

Hex:

 printf("64bit: %llp", 0xffffffffffffffff); 

Sortie:

 64bit: FFFFFFFFFFFFFFFF 

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

  • Vous pourriez avoir cette erreur sur gcc / mingw:

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

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

Ensuite, votre version de mingw ne par défaut pas à c99. Ajoutez cet indicateur de compilateur: -std=c99 .

Eh bien, une façon de le comstackr en x64 avec VS2008

Cela fonctionne comme prévu:

 int normalInt = 5; unsigned long long int num=285212672; printf( "My number is %d bytes wide and its value is %ul. A normal number is %d \n", sizeof(num), num, normalInt); 

Pour le code 32 bits, nous devons utiliser le spécificateur de format __int64 correct% I64u. Donc ça devient.

 int normalInt = 5; unsigned __int64 num=285212672; printf( "My number is %d bytes wide and its value is %I64u. A normal number is %d", sizeof(num), num, normalInt); 

Ce code fonctionne pour le compilateur VS 32 et 64 bits.