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

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