前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【译】为什么这样宏定义#define INT_MIN (-2147483647 - 1)?

【译】为什么这样宏定义#define INT_MIN (-2147483647 - 1)?

作者头像
用户7043923
发布2020-03-12 15:08:55
7200
发布2020-03-12 15:08:55
举报
文章被收录于专栏:J博士的博客J博士的博客

2的32次方为2147483648*2,0~(2147483648*2-1)这是32位机上无符号整数代表的范围。而32机的int范围为-2147483648~+2147483647

stackoverflow.com上有人提出这样一个问题:

代码语言:javascript
复制
if (-2147483648 > 0)
    std::cout << "true";
else
    std::cout << "false";

这将输出true, 而下面的程序会输出false:

代码语言:javascript
复制
if (int(-2147483648) > 0)
    std::cout << "true";
else
    std::cout << "false";

下面是对排名第一答案的翻译:

-2147483648不是一个“数”。实际上,-2147483648是一个表达式:一个正整数2147483648和一个一维运算符“-”。对于32位机,2147483648明显已经超过了int的范围。如果long int有“更大的范围”,编译器会自动的假定2147483648为long int型。(C++11的编译器会假定为long long int型)。这样才会得到用户想要的“负的2147483648”

然而很明显,如果long int和int一样,就不会存在“更大的范围”了。这样的话,2147483648溢出了,你的程序的行为是未定义的。

所以,通常我们这样定义

代码语言:javascript
复制
#define INT_MIN (-2147483647 - 1)

而不是,看似更直接的定义

代码语言:javascript
复制
#define INT_MIN -2147483648

后者可能造成意想不到的结果

原文地址:http://stackoverflow.com/questions/14695118/2147483648-0-returns-true-in-c#

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-05-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档