奇怪的“unsigned long long int”行为

10

可能重复的问题:
如何使用printf打印无符号长长整型?

#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)


2
请问,sizeof(unsigned long long int)的值是多少?并尝试使用'unsigned long int'代替'..long long..' - Zaur Nasibov
sizeof(unsigned long long int)返回8。我将变量类型更改为unsigned long int,它可以正常工作,但是sizeof(unsigned long int)返回4,因此它是普通的int。我需要更宽的范围。 - drevv
#include <cstdio> 表示 C++,但 unsigned long long int%llu 表示 C。你想使用哪个? - CB Bailey
我已经在Linux上检查了相同的代码,它可以正常工作... - drevv
#include <cstdio>using namespace std; 结合使用也可以。感谢您的回答! - drevv
显示剩余3条评论
1个回答

12
问题在于MinGW依赖于msvcrt.dll运行时。虽然GCC编译器支持C99的语法,如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;
}

请注意,直到VS 2010,MSVC没有inttypes.h,因此如果您想要在这些编译器上实现可移植性,您需要找到自己的inttypes.h副本或使用VS 2010中的副本(我认为该副本可以与早期的MSVC编译器配合使用,但我不完全确定)。同样,为了在这些编译器上实现可移植性,您需要对unsigned long long声明执行类似的操作,这将涉及挖掘stdint.h并使用uint64_t代替unsigned long long


1
SCNu64PRIu64宏不能用于unsigned long long。如果您想使用它们,需要将n声明为uint64_t - R.. GitHub STOP HELPING ICE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接