unsigned__int64 difference;
difference=(64*33554432);
printf ("size %I64u \n", difference);
difference=(63*33554432);
printf ("size %I64u \n", difference);
第一个#非常大。第二个数字是正确的答案。如何将它从62改为63导致这种改变?
第一个值是18446744071562067968 第二个值是2113929216
抱歉,值为64和63,而不是63和62。
答案 0 :(得分:9)
除非另有限定,否则整数文字的类型为int
。我假设在你所使用的平台上,int
是32位。因此,计算(64*33554432)
溢出并变为负数。然后将其转换为unsigned __int64
,这样现在可以转换回非常大的正整数。
瞧:
int main()
{
int a1 = (64*33554432);
int a2 = (63*33554432);
printf("%08x\n", a1); // 80000000 (negative)
printf("%08x\n", a2); // 7e000000 (positive)
unsigned __int64 b1 = a1;
unsigned __int64 b2 = a2;
printf("%016llx\n", b1); // ffffffff80000000
printf("%016llx\n", b2); // 000000007e000000
}
答案 1 :(得分:0)
在gcc上它可以正常工作并在两种情况下都给出正确的数字。
尺寸2113929216 尺寸2080374784
这可能是printf的错误吗? 您使用的是MSVC还是类似的?尝试单步执行调试器并在每次评估后检查差异。如果数字看起来那么那么它可能只是一个printf问题。但是,在linux下的gcc下它是正确的。