Étrange comportement «unsigned long long int»

Dupliquer possible:
Comment imprimez-vous un long long int non signé?

#include  int main () { unsigned long long int n; scanf("%llu",&n); printf("n: %llu\n",n); n /= 3; printf("n/3: %llu\n",n); return 0; } 

Quoi que je mette en entrée, je reçois une sortie très étrange, par exemple:

 n: 1 n/3: 2863311531 

ou

 n: 2 n/3: 2863311531 

ou

 n: 1000 n/3: 2863311864 

Quelle est la raison? Comment dois-je faire cela correctement?

(g ++ 3.4.2, Win XP)

Le problème est que MinGW s’appuie sur le runtime msvcrt.dll . Même si le compilateur GCC prend en charge C99-isms comme long long le runtime qui traite la chaîne de format ne comprend pas le spécificateur de format "%llu" .

Vous devrez utiliser le spécificateur de format de Microsoft pour les ints 64 bits. Je pense que "%I64u" fera l’affaire.

Si vous #include vous pouvez utiliser les macros fournies pour être un peu plus portables:

 int main () { unsigned long long int n; scanf("%"SCNu64, &n); printf("n: %"PRIu64"\n",n); n /= 3; printf("n/3: %"PRIu64"\n",n); return 0; } 

Notez que MSVC n’a pas inttypes.h jusqu’à VS 2010, donc si vous voulez être portable pour ces compilateurs, vous devrez vous procurer votre propre copie de inttypes.h ou prendre celle de VS 2010 (qui, à mon avis, travailler avec les anciens compilateurs MSVC, mais je ne suis pas tout à fait sûr Encore une fois, pour être portable avec ces compilateurs, vous devriez faire quelque chose de similaire pour la déclaration unsigned long long , ce qui impliquerait de déterrer stdint.h et d’utiliser uint64_t au lieu de unsigned long long .