来自unsigned_int64的意外行为;

Jak*_*ake 1 c++ variables unsigned-integer

unsigned__int64 difference;
difference=(64*33554432);
printf ("size %I64u \n", difference);
difference=(63*33554432);
printf ("size %I64u \n", difference);
Run Code Online (Sandbox Code Playgroud)

第一个#非常大.第二个数字是正确的答案.如何将它从62改为63会导致这种变化?

第一个值是18446744071562067968第二个值是2113929216

对不起,值为64和63,而不是63和62.

Oli*_*rth 9

除非另有限定,否则整数文字属于类型int.我认为在你所使用的平台上,一个int是32位.因此计算(64*33554432)溢出并变为负数.然后你把它转换成a 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
}
Run Code Online (Sandbox Code Playgroud)