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