为什么1024 * 1024 * 1024 * 2!= 1024 * 1024 * 1024 * 2

时间:2018-10-30 07:08:05

标签: c integer-overflow

在一开始,我编写了一个演示以获得2G内存,但是我遇到了这样的问题,我不知道为什么,num1,num2,num3有什么不同?

#include<stdio.h>
int main(){
    unsigned long num1 = 1024*1024*1024*2;
    unsigned long num2 = 1024*1024*1024*2.0;
    unsigned long num3 = 1024*1024*1024;
    num3 *= 2;
    printf("num1:%lu\n num2:%lu\n num3:%lu\n", num1, num2, num3);
    return 0;
}

输出:

num1:18446744071562067968
num2:2147483648
num3:2147483648

1 个答案:

答案 0 :(得分:7)

第一行unsigned long num1 = 1024*1024*1024*2;unsigned long初始化num1int)。计算1024*1024*1024*2的类型为int,因为所有值都是int文字。在至少其中一个上使用UL后缀以使其unsigned long

unsigned long num1 = 1024UL*1024*1024*2;

作为预防措施,由于乘法的从左到右的关联性,您最好将后缀放在第一个值上。这样,所有这些乘法都是在类型unsigned long而不是int的值之间完成的。

关于其他两种方法起作用的原因:第二行使用num2初始化double,在这种情况下,该精度足以产生正确的值;第三行也用num3初始化int,但是1024*1024*1024可以用32位int表示(它是2 ^ 30,小于2 ^ 31 -1)。之后,在unsigned long上乘以2,就可以按预期工作。