当前位置: 代码迷 >> 综合 >> int i = -2147483648 后面的事情
  详细解决方案

int i = -2147483648 后面的事情

热度:40   发布时间:2023-12-21 04:12:31.0

微博上看到的,为啥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的是这部分:


Suffix Decimal Constant
none int
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过的。。。