奇怪的“unsigned long long int”行为

时间:2011-05-13 20:13:50

标签: c++ c

  

可能重复:
  How do you printf an 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;
}

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

n: 1
n/3: 2863311531

n: 2
n/3: 2863311531

n: 1000
n/3: 2863311864

是什么原因?我该如何正确地做到这一点?

(g ++ 3.4.2,Win XP)

1 个答案:

答案 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 }。