【計算機原理篇】原碼、反碼和補碼

注意:計算機實際上是按照補碼進行存儲的,對計算機來說沒有原碼和反碼這種東西,原碼和反碼只是爲了我們方便計算補碼而定義的一種概念。

一、原碼

正數的原碼就是它本身,負數的原碼最高位爲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),漂亮,所有情況下,補碼的計算都是正確的了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章