一开始,我写了一个获得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发布于 2018-10-30 15:13:19
第一行unsigned long num1 = 1024*1024*1024*2;用一个int初始化一个unsigned long (num1)。计算1024*1024*1024*2的类型为int,因为所有值都是int字面值。至少在其中之一上使用UL后缀,使其成为unsigned long
unsigned long num1 = 1024UL*1024*1024*2;作为预防措施,您可能更喜欢将后缀放在第一个值上,因为乘法是从左到右的关联性。这样,所有这些乘法都是在unsigned long类型的值而不是int类型的值之间完成的。
至于其他两个方法为什么有效:第二行用double初始化num2,在本例中,它有足够的精度来生成正确的值;第三行也用int初始化num3,但是1024*1024*1024可以用32位int表示(它是2^30,小于2^31-1)。之后的2的乘法是在unsigned long上完成的,因此它的工作方式与预期一致。
https://stackoverflow.com/questions/53059040
复制相似问题