int i = -2147483648 后面的事情

微博上看到的,为啥INT_MIN=-INT_MAX-1。翻查了下,发现还是有点需要搞清楚的地方,记录如下。


编译器为gcc 4.8.2. C++规范为n3797


先看代码:

  auto a = -2147483648;
  auto b = 2147483648;
  auto c = 2147483647;
  cout <<a<<typeid(a).name()<<endl;
  cout <<b<<typeid(b).name()<<endl;
  cout <<c<<typeid(c).name()<<endl;

c为int,b为long足够直观,那么原因呢?在规范2.14.2,有个表格,适用于int的是这部分:


SuffixDecimal Constant
noneint
long int
long long int

所以2147483647类型为int,而2147483648由于超出了int的表达范围类型为long。


最大的问题是a的类型,输出为long。原因是:2147483648作为一个integer literal类型自然为long,再加上一个operator -最终得到-2147483648的值。可以参考2.13的描述,负数的-号在编译时其实是作为一个单独的token来处理的,而integer literal只包涵2147483648这部分,故2.13的规则适用于2147483648而不是-2147483648。

这样如int i = -2147483648, 其实涉及到了long到int的转换,可以参考标准4.7节。int i = -2147483650 这种就必然出发warning了。


不过新鲜出路的vs 2013 community update4 是不让int i = -2147483648过的。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值