溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

負(fù)數(shù)的計算機(jī)表示和溢出的關(guān)系是什么

發(fā)布時間:2021-10-13 11:30:44 來源:億速云 閱讀:170 作者:iii 欄目:編程語言

本篇內(nèi)容介紹了“負(fù)數(shù)的計算機(jī)表示和溢出的關(guān)系是什么”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

§ 0x00 數(shù)字的計算機(jī)表示

上學(xué)時,說數(shù)字在計算機(jī)中是以補(bǔ)碼形式表示的。補(bǔ)碼的定義是:

  1. 正數(shù)的補(bǔ)碼和原碼都與數(shù)值一樣;

  2. 原碼是最高位是符號位,其他位是與數(shù)據(jù)相等的數(shù)值;

  3. 負(fù)數(shù)的反碼是原碼的符號位保持不變,將其他bit翻轉(zhuǎn),然后反碼+1就是補(bǔ)碼了。

為什么是這樣的?這要從基本數(shù)字電路中的加法器說起。

§ 0x01 為什么這樣表示?

加法器的基本原理是,按位進(jìn)行邏輯運(yùn)算,進(jìn)位參與高一bit的的邏輯運(yùn)算。但它不支持減法操作。所以以補(bǔ)碼形式存儲負(fù)數(shù)時,就可以解決這個問題。 如下示例: 1byte的4-2,即4+(-2)。

-2: 0b1000 0010(原碼),0b1111 1101(反碼),0b1111 1110(補(bǔ)碼)
4: 0b0000 0100 (原碼),0b0000 0100(反碼),0b0000 0100(補(bǔ)碼)

最終的計算過程就是補(bǔ)碼和補(bǔ)碼的加法。

 
 0b1111 1110
+0b0000 0100
----------------
 0b0000 0010  =(+2)

最終的符號位因?yàn)檫M(jìn)位翻轉(zhuǎn)為0,變?yōu)檎怠?/p>

§ 0x02 有符號數(shù)的溢出

有符號數(shù)short類型的寬度為16bit。它的范圍為-32768~32767。為什么最大正值+1后會溢出為-32768呢?

最大的正數(shù)的補(bǔ)碼用16進(jìn)制為:0x7fff。 其+1后,其實(shí)并沒有溢出,而是變?yōu)?x8000。進(jìn)位后最高位為1了,也就是負(fù)數(shù)了。0x8000為真值是多少呢?

0x8000(補(bǔ))
減1反推出反碼:0x7fff
按位翻轉(zhuǎn)提到原碼:0x8000

那么0x8000的值應(yīng)該是多少呢?好像是0,最高位是1,表示是負(fù)數(shù),其他位都是0,就是-0。-0+1應(yīng)該是1。實(shí)際呢?

0x8001(補(bǔ))
-1反碼:0x8000
按位翻轉(zhuǎn):0xffff

0xffff的原碼值為-32767。0x8000應(yīng)該是它-1得到,所以0x8000補(bǔ)碼對應(yīng)的值應(yīng)該為-32768。

“負(fù)數(shù)的計算機(jī)表示和溢出的關(guān)系是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI