計算機爲何採用補碼來進行運算

基礎知識瞭解:

  在計算機內,整數的長度是肯定的,在字長爲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)。這就是補碼計算規則的由來。di

相關文章
相關標籤/搜索