我知道這是一個老問題,問了很多次。但我無法找到任何滿意的答案,因此再次提出要求。 有人可以解釋什麼情況下發生整數溢出和下溢? 我聽說過一些處理這個問題的'低階字節',有人可以解釋這是什麼嗎?java如何處理整數溢出和下溢?
謝謝!
我知道這是一個老問題,問了很多次。但我無法找到任何滿意的答案,因此再次提出要求。 有人可以解釋什麼情況下發生整數溢出和下溢? 我聽說過一些處理這個問題的'低階字節',有人可以解釋這是什麼嗎?java如何處理整數溢出和下溢?
謝謝!
你可以想象,當你只有2個地方,你都指望(所以每次加1)
00
01
10
11
100
但最後一個被「00」又砍倒。所以有你的「溢出」。你回到00.現在取決於比特的含義,這可能意味着幾件事情,但大多數時候這意味着你將從最高值變爲最低值。 (11到00)
馬克·彼得斯在評論中增加了一個很好的例子:即使沒有溢出,你也會遇到問題,因爲第一位用作簽名,所以你會從高到低不會丟失位。你可以說這個位與其它位置是「分開的」
它基本上處理它們而不報告異常,執行2的補碼運算而不關心溢出或下溢,根據機制返回預期的(但是不正確的)結果2的補碼算術。
這意味着超過或下溢的位只是簡單的斬波,Integer.MIN_VALUE - 1通常返回Integer.MAX_VALUE。
至於「低階字節」是一個解決方法,他們真的不是。使用Java字節進行算術時發生的事情是,它們被擴展爲整數,算術通常在整數上執行,並且最終結果可能完全包含在返回的整數中,因爲它具有更多的存儲容量比起始字節。
Java將數字循環到最大或最小整數(取決於它是溢出還是下溢)。
所以:
System.out.println(Integer.MAX_VALUE + 1 == Integer.MIN_VALUE);
System.out.println(Integer.MIN_VALUE - 1 == Integer.MAX_VALUE);
打印true兩次。
另一種思考java如何處理溢出/降低時鐘的方法是描繪一個anology時鐘。您可以一次向前移動一小時,但最終會重新開始工作。你可以把時鐘倒退,但一旦你超越了開始,你又會到最後。
那麼Java對大多數整數類型使用帶符號的二進制補碼,因此通常您將從-1變爲0.從最高值到最低值發生的方式相同,但沒有位溢出。當你從「0111」轉到「1000」時,例如, – 2011-03-14 16:49:06
林不知道確切解釋發生了什麼。它確實解釋了爲什麼操作「環繞」但下溢/溢出在java情況下具有語義含義。在處理器中,情況也是「可檢測的」,並且可以根據操作的需要以不同的方式處理(設置錯誤位等)。 – GrayWizardx 2011-03-14 16:49:47