奇怪的"unsigned long long int"行为

dre*_*evv 7 c c++

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

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

n: 1
n/3: 2863311531
Run Code Online (Sandbox Code Playgroud)

要么

n: 2
n/3: 2863311531
Run Code Online (Sandbox Code Playgroud)

要么

n: 1000
n/3: 2863311864
Run Code Online (Sandbox Code Playgroud)

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

(g ++ 3.4.2,Win XP)

Mic*_*urr 9

问题是MinGW依赖于msvcrt.dll运行时.即使GCC编译器支持C99-isms,就像long long处理格式字符串的运行时一样,也不了解"%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;
}
Run Code Online (Sandbox Code Playgroud)

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