計算機為什么采用補碼來進行運算


基礎知識了解:

  在計算機內,整數的長度是確定的,在字長為32位的計算機中,整數的長度就是32個二進制,這其中還包括了符號位(1表示正,0表示負)。這里面我們為了方便描述,就假設機器字長為8位。

例如,十進制整數23,二進制真值表示為10111,其原碼表示為 0001 0111。

十進制整數-23,二進制真值表示為-10111,原碼表示為 1001 0111。

簡而言之,源碼就是最高位為符號位,其他位表示該數的絕對值

如果計算機內部采用原碼表示數,那么在進行加法和減法運算的時候,最終都轉化為兩個絕對值的加運算和減運算,因此,在設計計算器的時候就既需要設計加法運算器,又要設計減法運算器(代價有點大,是否可以就用一種類型的運算器呢? 其實大多數人都喜歡做加法運算,不太喜歡用減法運算)。

補碼的思想

  我們希望只設計加法運算器,不用減法運算器,我們希望找到一種方案,采用這種方案做加運算 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則變為1而該位為1則變為0操作)而補碼是先求原碼的反碼,然后在反碼的末尾位加1后得到結果,即補碼是反碼+1
補碼就是最方便的方式。它的便利體現在,所有的加法運算可以使用同一種電路完成。
以-8作為例子。假定有兩種表示方法。一種是直覺表示法,即10001000;另一種是2的補碼表示法,即11111000。請問哪一種表示法在加法運算中更方便?
隨便寫一個計算式,16 + (-8) = ?
  16的二進制表示是 00010000,所以用直覺表示法,加法就要寫成:
    00010000
     +10001000
      ---------
      10011000
  可以看到,如果按照正常的加法規則,就會得到10011000的結果,轉成十進制就是-24。顯然,這是錯誤的答案。也就是說,在這種情況下,正常的加法規則不適用於正數與負數的加法,因此必須制定兩套運算規則,一套用於正數加正數,還有一套用於正數加負數。從電路上說,就是必須為加法運算做兩種電路。
現在,再來看2的補碼表示法。
    00010000
   +11111000
   ---------
   100001000
  可以看到,按照正常的加法規則,得到的結果是100001000。注意,這是一個9位的二進制數。我們已經假定這是一台8位機,因此最高的第9位是一個溢出位,會被自動舍去。所以,結果就變成了00001000,轉成十進制正好是8,也就是16 + (-8) 的正確答案。這說明了,2的補碼表示法可以將加法運算規則,擴展到整個整數集,從而用一套電路就可以實現全部整數的加法。

補碼的本質:

要將正數轉成對應的負數,其實只要用0減去這個數就可以了。比如,-8其實就是0-8。
已知8的二進制是00001000,-8就可以用下面的式子求出:

  00000000
  - 00001000
    ---------

因為00000000(被減數)小於0000100(減數),所以不夠減。請回憶一下小學算術,如果被減數的某一位小於減數,我們怎么辦?很簡單,問上一位借1就可以了。
所以,0000000也問上一位借了1,也就是說,被減數其實是100000000,算式也就改寫成:

  100000000
  -00001000
  ---------
   11111000
進一步觀察,可以發現100000000 = 11111111 + 1,所以上面的式子可以拆成兩個:
   11111111
  -00001000
  ---------
   11110111
  +00000001
  ---------
   11111000
補碼的兩個轉換步驟就是這么來的。(其中的 1111 1000 就是-8的補碼,是由對 000 1000 取反得到111 0111 加1 最終得到 111 1000,最后加上符號位1就是1111 1000)。這就是補碼計算規則的由來。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM