您當前的位置:首頁 > 體育

徹解“補碼”

作者:由 好好活 發表于 體育時間:2019-09-22

補碼反碼相等是什麼原因

希望用最短篇幅——

徹解“補碼”!

先看一下常見資料給出的定義:(8位整型)

原碼

:-127~127

一個二進位制數左邊加上符號位後所得的碼。最高位為符號位,“0”表示正,“1”表示負。

反碼

:-127~127

正數的反碼——與原碼相同。

負數的反碼——符號位為“1”,數值部分按位取反。

補碼

:-128~127

正數的補碼——與原碼相同。

負數的補碼——將其原碼除符號位之外的所有位取反後加1。即“

反碼+1

”。

這裡歸納了幾個常見的問題,接下來我們透過解決這幾問(尤其是第二問)來窺探“補碼”的實質:

1。原碼、反碼、補碼有什麼用?

*2。計算機如何運用補碼運算將“減法”轉變為“加法”?

3。獲取負數補碼時若“反碼+1”進位到符號位怎麼辦?

4。-0和-128的補碼如何獲取和表示?

——————以下為詳解——————

1。 原碼、反碼、補碼有什麼用?

原碼:用於計算機處理資料、並區分正負數。

反碼:用於……(我只知道linux中的許可權掩碼umask。)

補碼:用於計算機運算減法。

*2。 計算機如何運用補碼運算將“減法”轉變為“加法”?

先認識一個概念——

:表示一個計量系統的計數範圍。

例①:時針從10走到2,可反轉8格,也可正轉4格,8+4=12即為走時的模。-8或+4,即+(模-8)的結果相同。

例②:原地左轉90°或右轉270°後面朝的方向相同,90°+270°=360°即為轉角的模。-90°或+270°,即+(模-90°)的結果相同。

這裡我們給“模”一個定義(非權威定義,僅用於理解):

模是一個具有周期性的計數系統的最小正週期

由此可知,“

最高位為符號位的8位二進位制有符號整數的模”

為0111 1111B + 1B = 1000 0000B,即127+1=128。

10 - 2

=00001010B

- 00000010B

=00001010B

+(128 - 00000010B)

=00001010B

+11111110B

=00001000B(最高位的1溢位丟失)

=8

這是從模的角度解釋瞭如何將減法轉變為加法。

但僅有“模”的概念對於理解如何生成補碼是不夠的!

具體如何將

“連同減號在內的減數”

轉變為

“要加的補碼”

呢?明白這一點,就理解了補碼生成的方式。

細看上例“10 - 2”:

計算機中的 2 用 00000010B 表示,當運算 10 - 2 時,計算機檢測到 - 在 2 前面,便將 00000010B

全部位按位取反

得到 11111101B,再 +1B 得到 11111110B 即為 -2 的補碼。注意這裡獲取補碼的方式,其過程是:

- 00000010B →取絕對值 00000010B →全部位取反 11111101B → +1B 得11111110B

歸納:

取絕對值 → 取反 → +1

這裡我們給“負數補碼”一個定義(非權威定義,僅用於理解):

負數的補碼是取絕對值、取反、加一(完全不考慮符號位)。

“取絕對值→取反→加一”,

這就是計算機生成補碼的方式!這就是計算機將減法轉變為加法的邏輯構想!

注意:

不要考慮符號位!!!

3。獲取負數補碼時若“反碼+1”進位到符號位怎麼辦?

如果認真理解了第二問,相信這一問已經得到解決。

不考慮符號,取絕對值取反加一即得補碼

4。-0和-128的補碼該如何獲取和表示?

之所以會有此問,我覺得是大多資料對負數補碼解釋不夠細緻的原因,認真理解第二問後,用第二問中求補碼的方法:

–0

原碼:1000 0000 B

絕對值:0000 0000 B

取反:1111 1111 B

加一:0000 0000 B (最高位溢位丟失)

–128

原碼:無

絕對值:1000 0000 B

取反:0111 1111 B

加一:1000 0000 B

為整理思路和分享而寫下此文,文中如有錯誤,請各位知友不吝指正。

標簽: 補碼  取反  原碼  反碼  0000