亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

已經溢出時是否可以預測算術結果?

已經溢出時是否可以預測算術結果?

泛舟湖上清波郎朗 2022-11-30 16:47:16
假設我們有,這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


查看完整回答
反對 回復 2022-11-30
  • 1 回答
  • 0 關注
  • 91 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號