来自unsigned_int64的意外行为;

时间:2011-04-11 22:52:22

标签: c++ variables unsigned-integer

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。

2 个答案:

答案 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下它是正确的。