在計算機中,資料編碼方式可以有多種,最為常見的有原碼、反碼、補碼、移碼。一個正數的 原碼、補碼、反碼是相同的,負數則不同。
原碼
二進位制
一般8位,
將最高位用做符號位(0表示正數,1表示負數),其餘各位代表數值本身的絕對值的表示形
式。這種方式是最容易理解的。
例如 +1的原碼是00000001,–1的原碼是10000001。
因為是8位數。 首位為正負。 所以 1 表示為 2^0 前面的則只能全是0 了。
所以 1 然後補齊 0000000 得到 00000001。
原碼的計算不準確問題
但是直接使用原碼在計算時卻會有麻煩,比如(1)10+(–1)10=0,如果直接使用原碼則:
(00000001)2+(10000001)2=(10000010)2
解釋: 直接相加 然後 逢2 進1 則 10000002 因為有2 所以變為10000010
這裡 ()N 表示是 N進位制
這樣計算的結果是–2,也就是說,使用原碼直接參與計算可能會出現錯誤的結果。所以,原碼
的符號位不能直接參與計算,必須和其它位分開,這樣會增加硬體的開銷和複雜性
反碼
正數的反碼與原碼相同。負數的反碼符號位為1,其餘各位為該數絕對值的原碼按位取反。這個
取反的過程使得這種編碼稱為“反碼”。
例如,–1的反碼:11111110。
同樣對上面的加法,使用反碼的結果是:
(00000001)2+(11111110)2=(11111111)2
這樣的結果是負0,而在人們普遍的觀念中,0是不分正負的。反碼的符號位可以直接參與計
算,而且減法也可以轉換為加法計算
補碼
正數的補碼與原碼相同。負數的補碼是該數的反碼加1,這個加1就是“補”。
例如,–1的補碼:11111110+1=11111111。
再次做加法是這樣的:
(00000001)2+(11111111)2=(00000000)2
直接使用補碼進行計算的結果是正確的。
對一個補碼錶示的數,要計算其原碼,只要對它再次求補,可得該數的原碼。
由於補碼能使符號位與有效值部分一起參加運算,從而簡化運算規則,同時它也使減法運算轉
換為加法運算,進一步簡化計算機中運算器的電路,這使得在大部分計算機系統中,資料都使用補
碼錶示。
移碼
移碼是對補碼的符號位取反得到的一種編碼。移碼只用於表示浮點數的階碼,所以只用於整
數。
例如,-1的移碼為:01111111。
本作品採用《CC 協議》,轉載必須註明作者和本文連結