注意:計算機實際上是按照補碼進行存儲的,對計算機來說沒有原碼和反碼這種東西,原碼和反碼只是爲了我們方便計算補碼而定義的一種概念。
一、原碼
正數的原碼就是它本身,負數的原碼最高位爲1。
如果用一個字節來存儲整數,那麼20的原碼就是0001 0100,-20的原碼就是1001 0100
二、反碼
正數的反碼跟原碼一樣,負數的反碼按位取反,符號位不變。
如果用一個字節來存儲整數,那麼20的反碼就是0001 0100,-20的反碼就是1110 1011
三、補碼
正數的補碼跟原碼一樣,負數的補碼是反碼加1。
如果用一個字節來存儲整數,那麼20的補碼就是0001 0100,-20的補碼就是1110 1100
四、計算機爲什麼不用原碼和反碼,用的補碼
原因是使用原碼或者反碼計算結果是錯誤的,補碼纔是正確的。
下面我們來看一下20+(-20),三種情況下計算的結果
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),漂亮,所有情況下,補碼的計算都是正確的了。