我正在学习 C/C++ 并开始尝试使用大数字进行编程,但是在打印它们时出现了一个奇怪的错误。
这是我的示例代码:
unsigned long long shiftresult = 1ULL;
for (int i = 0; i < 64; i++) {
shiftresult = (1ULL << i);
printf("%lld << %d = %lld\n", 1ULL, i, shiftresult);
cout << 1ULL << " << " << i << " = " << shiftresult << endl;
}
问题在于,当循环到达
i = 63
时,printf打印-9223372036854775808
,而cout打印9223372036854775808
,这是“真实”输出。
有人可以解释为什么会发生这种情况吗?
您对
printf
使用了错误的格式说明符。
%lld
格式说明符需要一个 long long
参数,但您传递的是 unsigned long long
参数,因此无符号数将被解释为有符号数。
您需要使用
%llu
打印 unsigned long long
。