#include <cstdio>
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)
答案 0 :(得分:9)
问题在于MinGW依赖于msvcrt.dll
运行时。即使GCC编译器支持像long long
这样的C99主义,处理格式字符串的运行时也不理解"%llu"
格式说明符。
您需要将Microsoft的格式说明符用于64位整数。我认为"%I64u"
可以解决问题。
如果你#include <inttypes.h>
,你可以使用它提供的宏更便携:
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
}。