在一开始,我编写了一个演示以获得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
答案 0 :(得分:7)
第一行unsigned long num1 = 1024*1024*1024*2;
用unsigned long
初始化num1
(int
)。计算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,就可以按预期工作。