假設我們有,這int n = 2 ^ 31就是n-1 = 0111111111111111111111111111111我在本地可以得到的。我的猜測:首先轉換n為long-> 減法 -> 切片以適應int.System.out.println(n);System.out.println(Integer.toBinaryString(n-1) + " : " + Integer.bitCount(n-1));System.out.println(n-1);// output -21474836481111111111111111111111111111111 : 312147483647但是我沒有找到任何規范來驗證我的猜測,有嗎?來自整數溢出維基。當算術運算產生的結果大于上述 N 位整數的最大值時,溢出會將結果縮減為 2 的 N 次方模,僅保留結果的最低有效位并有效地導致回繞。如果我的猜測完全錯誤,那么它實際上是如何工作的呢?我可以參考任何鏈接嗎?任何幫助將不勝感激 :)
1 回答

翻過高山走不出你
TA貢獻1875條經驗 獲得超3個贊
這就是二進制補碼算術的工作原理。
根據 JLS §15.18.2 ,從 2^31 減去 1 與 2^31 加 -1相同,
對于整數和浮點數減法,總是
a-b
會產生與 相同的結果a+(-b)
。
還有那個
如果整數加法溢出,則結果是數學和的低位位,以某種足夠大的二進制補碼格式表示。如果發生溢出,則結果的符號與兩個操作數值的數學和的符號不同。
現在我們可以用二進制計算 2^31 和 -1 的和。2^31 是一個 1 后跟 31 個零,即 -2147483648 的補碼。-1 的補碼是 32,所以我們有:
1000 0000 0000 0000 0000 0000 0000 0000+1111 1111 1111 1111 1111 1111 1111 1111
如您所見,左邊的最后一位溢出了,但根據第二個摘錄,我們忽略了它。將所有這些相加,我們得到:
0111 1111 1111 1111 1111 1111 1111 1111
這是 2147483647
添加回答
舉報
0/150
提交
取消