2015-10-10 30 views
4

JLS §3.10.1int類型的最大十進制數字是2​​147483648或2147483647?

最大的十進制文本類型爲int的是2147483648

可這個說法被認爲是正確的,因爲Integer.MAX_VALUE2147483647

請注意,上述聲明中的重點是「int」。如果有人認爲它是在「十進制文字」的背景下討論的,那麼即使是2147483649等等也應該如此。

因此,如果東西是int類型,那麼其最大值必須是2147483647

我得到了錯誤還是該語句應該更新?

+1

我不確定我是否理解你的問題,但似乎在你的引用後面的兩個短段落闡明瞭這個問題。從JLS中的同一節開始:**如果十進制文字2147483648出現在非一元減運算符的操作數之外的任何地方,則爲編譯時錯誤;或者如果一個int類型的十進制文字大於2147483648(231)。** – alfasin

+0

@alfasin但是這樣做會使這個陳述有效,我懷疑嗎?我在這個陳述上的問題,如果在這個陳述「一元減號運算符」甚至被談論,然後我能理解。所以,它明顯含糊不清。 – hagrawal

+0

現在,你正在把事情從他們的上下文中提取出來......這個部分應該作爲一個整體來理解,句子結束的事實並不意味着上下文的效果。讀下面的句子可以澄清,'2147483648'是最大的十進制文字 - 它只有在負運算符在它之前有效。 – alfasin

回答

3

請注意,沒有負整數文字,Integer.MIN_VALUE是− 2147483648.所以-2147483648被解析爲「apply unary minus to 2147483648」。如果2147483648不是有效的十進制int字面值,或者您不能在程序中直接使用值Integer.MIN_VALUEint,那將是非常糟糕的。

備註:JLS 定義爲什麼是正確的。所以根據定義它是正確的。不過,這可能很糟糕。

+0

謝謝您的輸入。顯然這個陳述不是在談論'-2147483648',我擔心這個陳述的有效性。 – hagrawal

+2

「顯然這個陳述並不是在談論-2147483648」 - 我想你錯了。請繼續閱讀,你停止引用JLS – alfasin

+0

@alfasin我已經閱讀並理解了意圖的內容,但我的問題是關於該聲明的有效性。它是含糊不清的。 – hagrawal

1

雖然它可能被分配到不同類型的字段/變量,但每個文字都是特定類型的文字(布爾文字,整數文字,浮點文字等)。例如,2147483647是一個有效的整數字面值,而2147999999不是(雖然它是一個長文字,但2147999999L)。雖然寫作不清楚,但似乎沒有任何矛盾。

+0

感謝您的意見。但是我擔心這個陳述的有效性,這個陳述是不正確的。 – hagrawal

2

,從同樣的JLS section

十進制字面2147483648可僅顯示爲元負運算的操作數

int值= -2147483648;

存在

int值= 2147483648;

是編譯時錯誤。

+0

謝謝您的輸入。顯然這個陳述不是在談論'-2147483648',我擔心這個陳述的有效性。 – hagrawal

+0

該聲明僅從絕對意義上指「2147483648」,但只能作爲一元負值存在...... :) – Reimeus

1

注:Reimeus has the right answer以上。


是的,你是對的,JLS說

最大的十進制文本類型爲int的是2147483648(2^31)

,但如果你試圖編譯

int j = 2147483648; 

你會得到

Error:(20, 17) java: integer number too large: 2147483648 

2^31等於2147483648,它是0x80000000,但在32位二進制補碼錶示法中,它實際上等於-1。

因此,2^31不能用int表示。

int只能表示從Integer.MIN_VALUE(即-2^31)到Integer.MAX_VALUE(即(2^31)-1)的值。幸運的是,編譯器不接受該範圍之外的整數文字。

+0

謝謝您的輸入。是的,我擔心該聲明的有效性。 – hagrawal

+0

但根據JLS,這應該工作:'int j = 2147483648 - ;' –

+0

@KevinKrumwiede不,它不。唯一可行的是'int j = -2147483648;' –

相關問題