補碼和原碼的轉化過程及爲什麼需要用補碼

在計算機系統中,數值一律用補碼來表示(存儲)

原碼只表示字面值,真正參入運算和存儲的都是補碼,其中原碼最高位爲符號位,其他位表示該數的絕對值。 


主要原因:

1.原碼具有符號位,當兩個數符號位不一致時,不能直接用加法進行計算,“正數加正數” 和 “正數加負數” 需要分開計算,即需要兩套電路,對於計算機來說是非常大的負擔,.使用補碼,可以將符號位和其它位統一處理,即補碼幹掉了符合位;

2.正因爲1中的好處(負數可以參與運算了),我們可以把減法轉換爲加上一個負數,這樣減法和加法就可以統一了;

3.另外,兩個用補碼錶示的數相加時,如果最高位(符號位)有進位,則進位被捨棄。 

 

補碼與原碼的轉換


補碼與原碼的轉換過程幾乎是相同的。 
數值的補碼錶示也分兩種情況: 
(1)正數的補碼:與原碼相同。 
      例如,+9的補碼是00001001。 
(2)負數的補碼:符號位爲1,其餘位爲該數絕對值的原碼按位取反;然後整個數加1。 
      例如,-7的補碼:因爲是負數,則符號位爲“1”,整個爲10000111;其餘7位爲-7的絕對值+7的原碼 
     0000111按位取反爲1111000;再加1,所以-7的補碼是11111001。 
已知一個數的補碼,求原碼的操作分兩種情況: 
(1)如果補碼的符號位爲“0”,表示是一個正數,所以補碼就是該數的原碼。 
(2)如果補碼的符號位爲“1”,表示是一個負數,求原碼的操作可以是:符號位爲1,其餘各位取反,然後再整個數加1。 
     例如,已知一個補碼爲11111001,則原碼是10000111(-7):因爲符號位爲“1”,表示是一個負數,所以該位不變,仍爲   “1”;其餘7位1111001取反後爲0000110;再加1,所以是10000111。

 

補碼的思想

我們希望只設計加法運算器,不用減法運算器,我們希望找到一種方案,採用這種方案做加運算 1 + ( -1 ) ,兩個數可以直接根據二進制的加法規則做運算,得到0,而不必做減法。

用 0000 0000表示0是很自然的想法,用 0000 0001到 0111 1111表示1到127的正數,也是自然的想法,此時,最高位的0可以做符號標識,也可以看成普通的二進制位。

現在問題是:怎麼表示-1呢?

我們做一次逆向思維,0000 0001加上什麼樣的二進制數可以得到0000 0000?即:從右向左思考,加數的最右邊的最低位必須是1,根據二進制加法規則:1+1=0,進位爲1。再考慮次低位,加數的次低位也必須是1,然後加上1得0進一位,...依次類推,加數的8爲都必須是1,纔可以得到8個0。問題是最後產生一個進位,即:0000 0001 + (1111 1111)= 1 0000 0000

這在數學上是不可接受的,但是在計算機中去剛好合適,因爲在設計中,每個數的長度是確定的,所以無論結果最後是多少,都只保留8位,多餘的位會被丟棄。因此,我們可以將 1111 1111來表示-1,下面就是採用一種方式來合理的將-1怎麼變成 1111 1111這種形式。

補碼的本質:

要將正數轉成對應的負數,其實只要用0減去這個數就可以了。比如,-8其實就是0-8。
已知8的二進制是00001000,-8就可以用下面的式子求出:
 00000000
-00001000
---------
①因爲00000000(被減數)小於0000100(減數),所以不夠減。請回憶一下小學算術,如果被減數的某一位小於減數,我們怎麼辦?很簡單,問上一位借1就可以了。
所以,0000000也問上一位借了1,也就是說,被減數其實是100000000,算式也就改寫成:
100000000
-00001000
---------
 11111000

② 1 0000 0000 超出了系統可以表示的範圍,但是 我們可以發現100000000 = 11111111 + 1,而11111111 和 1 都是系統可以表示的, 所以上面的式子可以拆成兩個:
 11111111
-00001000
---------
 11110111   (上面這個過程實際上就是取反的過程)
+00000001
---------
 11111000   (上面這個過程就是加一的過程)

補碼的兩個轉換步驟就是這麼來的。(其中的 1111 1000 就是-8的補碼,是由對 000 1000 取反得到111 0111 加1 最終得到 111 1000,最後加上符號位1就是1111 1000)。這就是補碼計算規則的由來。

 

轉載自 https://blog.csdn.net/q_l_s/article/details/54894897

            https://blog.csdn.net/ftl111/article/details/79910835

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