注意:計算機實際上是按照補碼進行存儲的,對計算機來說沒有原碼和反碼這種東西,原碼和反碼只是為了方便我們理解而定義的一種概念。
一、原碼
正數的原碼就是它本身,負數的原碼最高位為1。
如果用一個字節來存儲整數,那么20的原碼就是0001 0100,-20的原碼就是1001 0100
二、反碼
正數的反碼跟原碼一樣,負數的反碼按位取反,符號位不變。
如果用一個字節來存儲整數,那么20的反碼就是0001 0100,-20的反碼就是1110 1011
三、補碼
正數的補碼跟原碼一樣,負數的補碼是反碼加1。
如果用一個字節來存儲整數,那么20的補碼就是0001 0100,-20的補碼就是1110 1100
四、計算機為什么不用原碼和反碼,而采用補碼來計算
原因是使用原碼或者反碼計算結果是錯誤的,補碼才是正確的。
下面我們來看一下分別使用原碼、反碼和補碼進行計算的結果
1、原碼計算
? ?0001 0100(20)
+?1001 0100(-20)
-------------------------------
? ? 10101000(-40)
20和-20的和是-40,結果顯然不對
2、反碼計算
? ?0001 0100(20)
+?1111 0101(-10)
--------------------------------
? ? 0000?1001(9)
20和-10的和是9,結果顯然不對
3、補碼計算
? ?0001 0100(20)
+?1110 1100(-20)
-------------------------------
? ? 0000 0000(0)
用反碼計算的結果正確
五、為什么一個字節能表示的整數范圍是-128到-127
首先最高位為0,其他位為1,就代表最大的整數,就是0111 1111(127),那么最小的數應該是1000 0001(-127)
那么問題來了,一個字節如何表示-128?
我們結合上面的原碼、反碼和補碼知識知道,我們知道1000 0000(-0)+0111 1111(+127)=1111 1111(-1)。這種情況下我們發現補碼的計算也不準了,-0與127的和居然是-1。剛剛不是還說用補碼計算時正確的嗎?
為了解決這種特殊情況,我們認為反碼1000 0000表示的是-128,不再表示-0(-0本身也沒有意義,用0就可以了),然后1000 0000(-128)+0111 1111(+127)=1111 1111(-1),漂亮,所有情況下,補碼的計算都是正確的了。