徹解“補碼”
補碼反碼相等是什麼原因
希望用最短篇幅——
徹解“補碼”!
先看一下常見資料給出的定義:(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
為整理思路和分享而寫下此文,文中如有錯誤,請各位知友不吝指正。