2015-11-17 51 views
21

我正在初始化兩個整數ab整數在括號中給出編譯錯誤

它爲a編譯罰款,但是b有錯誤。

public class Main_1 { 
    public static void main(String[] args) { 
     int a = -2147483648; //Working fine 
     int b = -(2147483648); //Compilation error: The literal 2147483648 of type int is out of range 
    } 
} 

這是爲什麼呢?

+34

編譯器錯誤類型給這個提示,不是嗎? –

+0

不,它不是一個提示其錯誤... :) –

回答

50

的原因是int數據類型具有範圍[-2147483648, 2147483647]有效值。

當您將2147483648包含在圓括號內時,它將成爲一個表達式,將被評估爲int。但是,2147483648太大而不適合int(太大了)。

對於-2147483648,問題不會發生,因爲它是有效的int值。

的JLS的相關部分:

  • 添加括號創建一個 「括號的表達式」(section 15.8.5
  • 一個整數文字,如2147483648,被視爲一個int默認(section 3.10.1

    如果整數文字後綴爲ASCII字母Ll(ell),則其類型爲long;否則它是int(§4.2.1)類型。整型

+0

如果表達式變成int。那爲什麼聲明的int工作正常。 –

+10

@ShowStopper用這種方式來看:'-2147483648'是有效的,它是最小值。但是,編寫' - (2147483648)',需要首先將'2147483648'作爲'int'來計算(因爲括號),但是這個值太大了1. – Tunaki

+0

謝謝@Tunaki,所以我知道的是括號是整數的一部分,並將佔整數範圍 –

11

int值從-2147483648變爲2147483647。因此-(2147483648)是OutOfRange,因爲括號內的值被評估爲int。你可以放入括號中的最大值爲

Integer.MAX_VALUE //Which is equals to 2147483647 
4

最大值爲2147483647和INT的最小值是-2147483648。但是,如果將2147483648放置在大括號中,它最初會被認爲是+2147483648,並且它在整數範圍內無效。

1

int數據類型是32-bit signed two's complement integer

最小值是- 2,147,483,648.(-2^31)

最大值爲2,147,483,647(inclusive).(2^31 -1)

7

的編譯錯誤是相當清楚的:您正在使用的int文字是超出範圍。如果你真的想這樣做,你可以使用long文字:

int b = (int) -(2147483648L); 

或者double文字:

int b = (int) -(2147483648.0); 
2

想象這樣的一個好方法是看(int) -(2147483648)爲:

(int) -1 * (2147483648) 

當它由編譯器評估時,它說,我必須首先將括號中的數字轉換爲整數,然後乘以負數1.然後,編輯對數字進行範圍檢查,發現它大於可以放入整數(2147483648)中的數值,這是編譯錯誤。