专栏首页J博士的博客【译】为什么这样宏定义#define INT_MIN (-2147483647 - 1)?

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

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

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

if (-2147483648 > 0)
    std::cout << "true";
else
    std::cout << "false";

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

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溢出了,你的程序的行为是未定义的。

所以,通常我们这样定义

#define INT_MIN (-2147483647 - 1)

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

#define INT_MIN -2147483648

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • CAN总线(一)

    原文出处:http://www.cnblogs.com/jacklu/p/4729638.html

    用户7043923
  • RtlInitUnicodeString

    用户7043923
  • error LNK2019: 无法解析的外部符号

    最近在写与驱动程序通信的Windows应用程序,在VS2013编译时出现了“error LNK2019:无法解析的外部符号”的错误。

    用户7043923
  • 印度核电站网络上发现朝鲜恶意软件

    Kudankulam核电站(KNPP)可能已经感染了危险的恶意软件这一消息最开始是在Twitter上流传,10月30号,印度核电公司(NPCIL)证实核电站的网...

    FB客服
  • 浅谈八大顶尖网银恶意软件

    Cyphort分析了黑客使用的八个破坏银行和电子支付的恶意软件,这些恶意金融软件侵害和威胁了数以百万计的用户。 八大金融恶意软件 1、Zeus: 自2007年问...

    FB客服
  • 基于内容的图像检索技术综述 传统经典方法

    原创声明:本文为 SIGAI 原创文章,仅供个人学习使用,未经允许,不得转载,不能用于商业目的。

    SIGAI学习与实践平台
  • windows系统下VS2013或者VS2017的C4996错误解决方法

    由于微软在VS2013中不建议再使用c的传统库函数scanf,strcpy,sprintf等,所以直接使用这些库函数会提示C4996错误,在源文件中添加以下指令...

    黑泽君
  • excel双坐标图表的做法(两个Y轴)

    所谓双坐标图表,就是左右各一个Y轴,分别显示不同系列的数值。该图表主要用于两个系列数值差异较大的情况。如下例。

    用户1756920
  • 活动推荐|下周(12.10-12.16)第十三届中国IDC产业年度大会

    大会介绍:本次大会即将聚焦行业热点,并共同探讨数据中心、云计算、大数据、人工智能等前沿科技,为IDC企业、电信运营商、互联网企业和IT厂商搭建高效沟通与交流的平...

    镁客网
  • ByteEdu教育平台--A*算法经典例子Go实现

    文章地址:http://www.byteedu.com/thread-763-1-1.html

    李海彬

扫码关注云+社区

领取腾讯云代金券