奇怪的“unsigned long long int”行为

可能重复:
你如何printf一个unsigned long long int?

#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; } 

无论我输入什么,我得到非常奇怪的输出,例如:

 n: 1 n/3: 2863311531 

要么

 n: 2 n/3: 2863311531 

要么

 n: 1000 n/3: 2863311864 

什么原因? 我该怎么做才能正确?

(g ++ 3.4.2,Win XP)

问题是MinGW依赖于msvcrt.dll运行时。 尽管GCC编译器支持C99-isms,例如处理格式字符串的运行时不能理解"%llu"格式说明符。

您需要将Microsoft的格式说明符用于64位整数。 我认为"%I64u"会做到这一点。

如果#include 您可以使用它提供的宏来更轻松:

 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; } 

请注意,MSVC在VS 2010之前没有inttypes.h ,因此如果您想要移植到那些编译器,您需要挖掘自己的inttypes.h副本或从VS 2010中获取一个(我认为将会使用早期的MSVC编译器,但我不完全确定。 然后,为了便于那些编译器,你需要为unsigned long long声明做类似的事情,这需要挖掘stdint.h并使用uint64_t而不是unsigned long long