1. 程式人生 > >原碼反碼補碼推導原理

原碼反碼補碼推導原理

 被加數                             被減數
    加數                                減數
————                       ————
       和                                   差

減法和加法在某些方面是互為補充的,這兩種計算機制不同。
加法從最右邊一列向最左邊一列計算,每一列的進位都加到下一列中。
減法不用進位,相反,要用到借位---一種本質上與加法不同的機制。

   124
-   77
———
    47

從右邊一列開始,首先7比4大,所以從2借1。這樣子變成了14-7=7,
2被借了1,變成1,繼續,1比7小,所以繼續從1借1,11減7等於4。
1被借1後成為1,1減1變成0,最後的結果為47

一般不會使用邏輯閘來實現減法器,乘法器,除法器,是利用數學規律在加法器的基礎上進行拓展。
那減法是怎麼樣變成加法的。在《原碼反碼補碼》那節課直接給大家演示了一下轉換辦法。
但那個轉換辦法是怎麼樣推匯出來的呢?接下來給大家簡單說說這個推導過程。

比如上面的減數是2位數:77,而兩位數中最大的十進位制數為:99,如果拿99-77,這樣子就不存在需要借位了。
  99          
- 77
———
  22

如果減數為三位數的話,就用3位數中最大的數字999去減,以此類推。

這樣子就得到了一個77的補數。(補數和補碼可不是一回事,別混淆)
77之9的補數是22,反之,22之9的補數是77。
這樣做的好處在於,無論減數是多少,計算這個減數9的補數永遠不需要借位。

計算出減數9的補數之後,把它加到原來的被減數上:
   124
+  22
————
   146


再加一個1,並且減去100:

  146
 +   1
- 100
_________
    47

你也許有點懵了,發生了什麼,怎麼結果突然就蹦出來呢?

原始題目是:124-77
表示式加一個數再減同一個數得到的結果是一樣的,所以先加上100,再減去100.


124-77+100 -100
等同於: 124-77 +99+1-100

再進行變換 124+ (99-77)+1-100

這與前面描述過的用9的補數進行的計算是一致的。
雖然用了兩個減法和兩個加法來代替一個減法,但是也因此省去了討厭的借位。
那如果減數比被減數大怎麼辦呢?例如

    77
- 124
————
   ???

減數比被減數大,只需要交換兩數的位置,再把上面的過程重複一下,然後計算結果前面加一個負號就行了。


現在完整的回憶一下流程:
124        -            77
124        -            77             +       100          -    100
124        -            77             +       99           +    1   -  100
124        +           (99             -       77)        +    1   -  100
=124     +          23     -100
=47

0111 1100    -   0100 1101
0111 1100    -   0100 1101   +      1 0000 0000   -  1 0000 0000
0111 1100    -   0100 1101   +      1111 1111   +1 -  1 0000 0000
0111 1100   +   (1111 1111  -       0100 1101)  +1 -  1  0000 0000
0111 1100    +  1011 0011   - 1 0000 0000
= 1 0010 1111
=    0010 1111