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的是這部分:


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過的。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章