日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Math.abs为Integer.Min_VALUE返回错误的值

發布時間:2024/4/13 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Math.abs为Integer.Min_VALUE返回错误的值 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
Math.abs為Integer.Min_VALUE返回錯誤的值 這段代碼: System.out.println(Math.abs(Integer.MIN_VALUE)); 回報-2147483648這難道不應該返回絕對值2147483648?


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

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返回错误的值的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。