計組:計算機爲何有反碼補碼?不列公式!

你是如何作減法的?

200-134=? 相信這個問題難不倒你,讀到這句話的時候,你可能已經口算出了答案。讓咱們慢一點,來看看咱們是如何一步一步作減法的。
​ 你的腦海裏可能浮現出了一個詞:借位。沒錯,減法比加法麻煩的就是,它沒有進位,但有借位這個煩人的東西。對於這道題,將它寫成豎式,從最右邊那一列入手,0是小於4的,因此往左邊借一位,再用10減去4獲得6。由於咱們往左邊的0借了一位,因此實現上這時的0應該變成-1,-1是小於3的,因此咱們又要往左邊借一位。你看,借位是多麼的麻煩!code

那該如何是好呢,大人?

​ 那麼如何經過邏輯門來實現這個邏輯呢?嘿!嘿!嘿!看字,別再想了,你簡直是在折磨本身,爲了讓本身好過一點,咱們須要想辦法來回避借位操做:
​ 什麼狀況下,被減數不須要借位?格嘰,格嘰,格嘰格嘰,開動你的腦筋。沒錯,每一位都是9的時候!這裏的操做數是3,因此咱們取3個9減去134。it

從一串9中減去一個數,稱爲對9求補數io

​ 那麼如今,原式變成了這樣class

\[200+(999-134)-999 \]

​ 由於200-102是個整數,再加上999就進位了。因此咱們不妨把減999變成減1000,這樣作減法的時候好算一點二進制

\[200+(999-134)+1-1000 \]

​ 這樣,咱們就回避了借位。在十進制中是取對9的補數,那麼在二進制中就是使用1了,上面的例子可化爲:方法

\[\begin{equation}\begin{split} 11001000\\ -10000110\\ \hline \end{split}\end{equation} \]

​ 第一步,咱們用11111111(十進制中爲255)減去減數:計算機

\[\begin{equation}\begin{split} &{11111111}\\ -&{10000110}\\ &\hline {01111001} \end{split}\end{equation} \]

​ 在二進制中,對1求補數能夠不用減法,由於1減去1爲0,1減去0爲1,只須要按位取反便可。因此對1求補數,也能夠稱爲相反數或者反碼di

​ 第二步,把減數對1的補數與被減數相加co

\[\begin{equation}\begin{split} {01111001}\\ +{11001000}\\ \hline {101000001} \end{split}\end{equation} \]

​ 第三步,將所得結果加1display

\[\begin{equation}\begin{split} {101000001}\\ +{1}\\ \hline {101000010} \end{split}\end{equation} \]

​ 第四步,將所得結果減去100000000(十進制中的256):

\[\begin{equation}\begin{split} {101000010}\\ -{100000000}\\ \hline {001000010} \end{split}\end{equation} \]

​ 結果001000010至關於十進制的66

有符號數的減法

​ 在計算機中,咱們只有0和1,可沒有負號告訴咱們這個數是負數。那麼如何來表示負數呢?最簡單的固然是用一個二進制數表示負號,當這一位爲0時表示正數,當爲1時表示負數。不過,根據咱們上面的方法,咱們用求補數的辦法規定正負數,還能輕鬆的將正負數相加。不過這種方法也不是十全十美的,缺點就是你得提早知道可能遇到的全部數字的位數。

​ 若是你的花唄額度是500,而且你的餘額不超過500,那麼你的額度應該在-500到499之間,那咱們就能夠把:

\[-500,-499,-498....-2,-1,0,1,2...497,498,499 \]

寫成

\[500,501,502...998,999,000,001,002...497,498,499 \]

​ 這種機制在二進制中稱爲2的補數。(求2的補數就是先求1的補數再加1)通俗點就是將0到1000分紅兩半,前一半爲正,後一半爲負。對應到二進制就是,1開頭的爲負數,0開頭的爲正數。跟一開始的用特定二進制位表示正負數從這裏來看,沒有什麼區別。01嘛,二進制。

​ 如今134-200就至關於134加上-200:

\[\begin{equation}\begin{split} 010000110\\ +100111000\\ \hline 110111110 \end{split}\end{equation} \]

​ 10111110是1000010(66)對2的補數,又110111110首位是1表明是負的,因此結果是-66

相關文章
相關標籤/搜索