微博上看到的,为啥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过的。。。