下面是關於Java語言規範的解釋。
上整數常量(JLS 3.10.1)的部分這樣說:
最大十進制字面int類型是2147483648
(2 )。從0
到2147483647
的所有十進制文字可以出現在可能出現整型文字的任何位置,但文字2147483648
可能僅出現在一元否定運算符-
的操作數中。
所以......
第一條語句是一個合法的整數文字值的分配。沒有編譯錯誤。
第二個聲明是編譯錯誤,因爲2147483648
不在一元否定運算符之前。
第三條語句不包含超出範圍的整數字面值,因此從該角度看它不是編譯錯誤。
而是,第三種說法是如JLS 15.18.2中所述的二進制加法表達式。這說明了整數大小寫如下:
如果整數加法溢出,那麼結果就是以一些足夠大的二進制補碼格式表示的數學和的低位。如果發生溢出,則結果的符號與兩個操作數值的數學和的符號不同。
因此,2147483647 + 1
溢出幷包裝到-2147483648
。
@Peter Lawrey的建議(輕率?)第三語句可「由編譯器重寫」爲+2147483648
,導致編譯錯誤。
這是不正確的。
JLS中沒有任何內容表明常量表達式可以與非常量表達式具有不同的含義。相反,在例如1/0
的情況下,JLS翻轉事物並且說該表達式不是一個常量表達式,因爲它異常終止。 (它在JLS 15.28)
JLS極力避免某些Java構造意味着不同事情的情況,這取決於編譯器。例如,「明確賦值」規則非常特別,以避免只有智能編譯器可以推斷出該變量在使用之前始終被初始化的情況。從代碼可移植性的角度來看,這是一件好事。
編譯器實現者爲了執行特定於平臺的事情而存在「擺動空間」的唯一重要領域是併發性和Java內存模型。有一個合理的實用原因 - 允許多線程Java應用程序在多核/多處理器硬件上快速運行。
對不起,我沒有得到你 – satheesh 2011-02-28 09:36:07