Math.abs为Integer.Min_VALUE返回错误的值
生活随笔
收集整理的這篇文章主要介紹了
Math.abs为Integer.Min_VALUE返回错误的值
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
| ? |
-------------------------------------------------------------------------------------------------------------------------
1. Integer.MIN_VALUE是-2147483648的,但一個32位整數可以包含最高值是+2147483647。試圖代表+2147483648在32位int將有效地“翻轉”到-2147483648。這是有符號整數,兩個的二進制表示+2147483648和-2147483648是相同的。這一點,也沒有問題,但如+2147483648被認為是超出范圍。 對于在這個問題上多一點讀書,你可能要檢查出兩個的維基百科的文章2. 下面是Java的醫生說的Math.abs()
3. 你指出的行為確實,反直覺的。但是,此行為是由javadoc文檔中指定的Math.abs(int):如果不是負數,則返回。 如果是負的,否定的,則返回。即,Math.abs(int)應該像下面的Java代碼: public static int abs(int x){if (x >= 0) {return x;}return -x; } 也就是說,在否定的情況下,-x。 按照JLS的第15.15.4中,-x等于(~x)+1,其中~是位運算符。 要檢查這是否聽起來很正確,讓我們-1為例。 整數值-1是可記為0xFFFFFFFF在十六進制中的Java(看看這個用println或任何拍攝-(-1)給出: -(-1) = (~(0xFFFFFFFF)) + 1 = 0x00000000 + 1 = 0x00000001 = 1 因此,它的工作原理。 現在嘗試用Integer.MIN_VALUE。知道的最低整數可以表示為0x80000000,即,優先位設置為1,并設置為0的31個剩余比特,我們有: -(Integer.MIN_VALUE) = (~(0x80000000)) + 1 = 0x7FFFFFFF + 1 = 0x80000000 = Integer.MIN_VALUE 這就是為什么Math.abs(Integer.MIN_VALUE)回報Integer.MIN_VALUE。還要注意的是0x7FFFFFFF是Integer.MAX_VALUE。 這就是說,我們如何才能避免出現問題,由于在未來的這個反直覺的返回值?我們可以,正如,鑄就我們ints到long之前。然而,我們必須要么趕逐回ints,這不工作Integer.MIN_VALUE == (int) Math.abs((long)Integer.MIN_VALUE)。 或繼續long?本希望我們永遠不會調用Math.abs(long)用一個值等于Long.MIN_VALUE,因為我們也有Math.abs(Long.MIN_VALUE) == Long.MIN_VALUE。我們BigInteger到處都是,BigInteger.abs()確實總是返回一個正值。這是一個很好的選擇,硬朗的操控比原始整數類型有點慢。 我們可以寫我們自己的包裝器Math.abs(int),像這樣: /*** Fail-fast wrapper for {@link Math#abs(int)}* @param x* @return the absolute value of x* @throws ArithmeticException when a negative value would have been returned by {@link Math#abs(int)}*/ public static int abs(int x) throws ArithmeticException {if (x == Integer.MIN_VALUE) {// fail instead of returning Integer.MAX_VALUE// to prevent the occurrence of incorrect results in later computationsthrow new ArithmeticException("Math.abs(Integer.MIN_VALUE)");}return Math.abs(x); } 作為最后一點,這個問題似乎是眾所周知的見,例如有關相應的FindBugs規則此項。
4. 一看就知道你期待的結果,投Integer.MIN_VALUE至long: System.out.println(Math.abs((long) Integer.MIN_VALUE));
5. 2147483648不能存儲在java中一個整數,其二進制表示是為-2147483648。
6. 但(int) 2147483648L == -2147483648有一個負數而沒有正相當于所以沒有積極的價值吧。你會看到則為Long.MAX_VALUE的行為。
本文標題 :Math.abs為Integer.Min_VALUE返回錯誤的值
轉載于:https://www.cnblogs.com/dailidong/p/7571201.html
總結
以上是生活随笔為你收集整理的Math.abs为Integer.Min_VALUE返回错误的值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (原)数据结构——线索二叉树
- 下一篇: methanol 模块化的可定制的网页爬