2014-07-16 40 views
62

在Java中,當我們宣佈Java的原始範圍計算

short number=1024*1024*1024; 

它會給編譯時錯誤,但

short number=1024 * 1024 * 1024 * 1024; 

編譯罰款。爲什麼會發生?

+0

@ Raedwald,Erwin,Ivan,Carlos我的問題與你提到的問題不同。這裏的問題不僅僅是關於數字的字面和運行時間評估,它還涉及到短小的範圍,甚至在上述問題中甚至儘管沒有表達式是字面的,但是第一個給出錯誤,問題是爲什麼這樣的行爲在編譯中發生?任何方式感謝,現在我滿意下面的答案。 –

+0

好的問題+1從我身邊 –

回答

72

在這種情況下,編譯器將評估計算(因爲它只包含常量)並嘗試將結果分配給變量。如果可能的話,這種計算是通過int類型完成的,並且只在轉讓時轉換爲short

在你的情況下,第一次計算太大而不適合short1073741824)。第二個將溢出int,最後在short支持的範圍內(0)。所以在這種情況下,作業就起作用。

請注意,您可能永遠都不想在代碼中依賴這些東西。

+10

我們可以通過將其中一個更改爲1024L來看到這種情況,在這種情況下,計算完成爲「long」並且不會發生溢出,從而再次導致編譯錯誤。 –

+1

@ user2169777: - 精度損失意味着您正在丟失給定值的信息(*短數據類型是一個16位有符號二進制補碼整數,它的最小值爲-32,768,最大值爲32,767 (含)*)在第一種情況下,短的範圍是交叉的(1073741824),因此您將丟失信息。所以你收到錯誤。 –

11

您面臨的問題是您的號碼是wrapping around。在第一種情況下,它不會環繞,因此它會溢出短路範圍。但是在第二種情況下,它在計算後迴繞,因此它出現在short的範圍內,所以你沒有編譯時錯誤。 ()短數據類型是一個16位有符號二進制補碼整數,其最小值爲-32,768,最大值爲32,767(包含在內))在第一種情況下,短的範圍是交叉的(1073741824),因此您將丟失信息。

帶符號的整數的收縮轉換爲整數類型T 簡單地丟棄所有,但n個最低階位,其中n是用於表示類型T.比特數

編輯: -

JLS §3.10.1(在this類似的問題非常正確地提到)

它是一個編譯時間錯誤,如果一個十進制字面int類型的較大 比2147483648(2 ),或者如果十進制字面2147483648出現不是作爲一元減運算符的操作數其他 任何地方 (§15.15.4)。