1
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。

4

2 回答 2

9

除非另有限定,否则整数文字的类型为int。我假设在您所在的平台上,anint是 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
}
于 2011-04-11T22:56:48.310 回答
0

在 gcc 上,它工作正常,并且在两种情况下都给出了正确的数字。

尺寸 2113929216 尺寸 2080374784

它可能是printf的错误吗?您使用的是 MSVC 还是类似的?尝试通过调试器单步执行并在每次评估后检查差异。如果数字看起来正确,那么它可能只是一个 printf 问题。但是,在 linux 上的 gcc 下是正确的。

于 2011-04-11T22:59:27.037 回答