原碼反碼補碼推導原理
阿新 • • 發佈:2019-01-01
被加數 被減數
加數 減數
———— ————
和 差
加法從最右邊一列向最左邊一列計算,每一列的進位都加到下一列中。
減法不用進位,相反,要用到借位---一種本質上與加法不同的機制。
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
你也許有點懵了,發生了什麼,怎麼結果突然就蹦出來呢?
表示式加一個數再減同一個數得到的結果是一樣的,所以先加上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 + 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