首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么是1024*1024*1024*2 != 1024*1024*1024*2

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

Stack Overflow用户
提问于 2018-10-30 15:08:05
回答 1查看 971关注 0票数 3

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

代码语言:javascript
复制
#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;
}

输出:

代码语言:javascript
复制
num1:18446744071562067968
num2:2147483648
num3:2147483648
EN

回答 1

Stack Overflow用户

发布于 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

代码语言:javascript
复制
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上完成的,因此它的工作方式与预期一致。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53059040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档