奇怪的“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
。