天天看點

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont

Math.abs為Integer.Min_VALUE傳回錯誤的值 這段代碼:

回報<code>-2147483648</code>這難道不應該傳回絕對值<code>2147483648</code>?

-------------------------------------------------------------------------------------------------------------------------

1. <code>Integer.MIN_VALUE</code>是<code>-2147483648</code>的,但一個32位整數可以包含最高值是<code>+2147483647</code>。試圖代表<code>+2147483648</code>在32位int将有效地“翻轉”到<code>-2147483648</code>。這是有符号整數,兩個的二進制表示<code>+2147483648</code>和<code>-2147483648</code>是相同的。這一點,也沒有問題,但如<code>+2147483648</code>被認為是超出範圍。

對于在這個問題上多一點讀書,你可能要檢查出兩個的維基百科的文章

2. 下面是Java的醫生說的Math.abs()

3. 你指出的行為确實,反直覺的。但是,此行為是由javadoc文檔中指定的<code>Math.abs(int)</code>:如果不是負數,則傳回。 如果是負的,否定的,則傳回。即,<code>Math.abs(int)</code>應該像下面的Java代碼:

也就是說,在否定的情況下,<code>-x</code>。 按照JLS的第15.15.4中,<code>-x</code>等于<code>(~x)+1</code>,其中<code>~</code>是位運算符。 要檢查這是否聽起來很正确,讓我們-1為例。 整數值<code>-1</code>是可記為<code>0xFFFFFFFF</code>在十六進制中的Java(看看這個用<code>println</code>或任何拍攝<code>-(-1)</code>給出:

是以,它的工作原理。 現在嘗試用<code>Integer.MIN_VALUE</code>。知道的最低整數可以表示為<code>0x80000000</code>,即,優先位設定為1,并設定為0的31個剩餘比特,我們有:

這就是為什麼<code>Math.abs(Integer.MIN_VALUE)</code>回報<code>Integer.MIN_VALUE</code>。還要注意的是<code>0x7FFFFFFF</code>是<code>Integer.MAX_VALUE</code>。 這就是說,我們如何才能避免出現問題,由于在未來的這個反直覺的傳回值?我們可以,正如,鑄就我們<code>int</code>s到<code>long</code>之前。然而,我們必須要麼趕逐回<code>int</code>s,這不工作<code>Integer.MIN_VALUE == (int) Math.abs((long)Integer.MIN_VALUE)</code>。 或繼續<code>long</code>•本希望我們永遠不會調用<code>Math.abs(long)</code>用一個值等于<code>Long.MIN_VALUE</code>,因為我們也有<code>Math.abs(Long.MIN_VALUE) == Long.MIN_VALUE</code>。我們<code>BigInteger</code>到處都是,<code>BigInteger.abs()</code>确實總是傳回一個正值。這是一個很好的選擇,硬朗的操控比原始整數類型有點慢。

我們可以寫我們自己的包裝器<code>Math.abs(int)</code>,像這樣:

作為最後一點,這個問題似乎是衆所周知的見,例如有關相應的FindBugs規則此項。

4. 一看就知道你期待的結果,投<code>Integer.MIN_VALUE</code>至<code>long</code>:

5. 2147483648不能存儲在java中一個整數,其二進制表示是為-2147483648。

6. 但<code>(int) 2147483648L == -2147483648</code>有一個負數而沒有正相當于是以沒有積極的價值吧。你會看到則為Long.MAX_VALUE的行為。

本文标題 :Math.abs為Integer.Min_VALUE傳回錯誤的值