計算機只會加法,那麼它如何用加法來計算減法呢?

計算機中的加減乘除都是經過加法實現的,那麼你確定很好奇,加法和減法是徹底不一樣的操做啊,如何用加法來進行減法運算呢?下面我就經過幾個例子,來解釋一下具體的操做過程。web

二進制加法

開始以前,咱們先複習一下最簡單的二進制的加法是如何運算的:編程

二進制是逢二進一,1001+1101=10110  最高位直接進一位就好了。微信

十進制減法

大數減少數

咱們來看一個十進制減法的例子:251-174=77,很簡單是否是?小學低年級的題目,個位不足向十位借位,十位不足向百位借位,咱們是這麼口算的。編輯器

這裏用到了借位,若是咱們不使用借位,能不能計算減法呢?spa

爲了便於說明,咱們先複習一下,減數,被減數,差的概念:爲了不借位,咱們用如下步驟來計算:首先先用999減去減數174,獲得差825:而後用被減數251加上差825,等於1076:最後,因爲剛纔第一步多借了999,如今要把多出來的999減掉。爲了不借位,咱們在多加一個1,999+1=1000 湊成 1000,而後減去1000,這樣從頭至尾就不會涉及到借位的問題。.net

整個公式就是:251 + (999 - 174)+ 1 - 1000 = 77 你有沒有發現,這樣就把借位的問題避開了哦。設計

小數減大數

若是是174-251該怎麼辦呢?狀況稍有不一樣,前面的步驟仍是同樣的。先用999-251=748而後用被減數174加上差748,等於922:按照前面的例子,如今應該是 922 + 1 - 1000 了,可是這樣就涉及到借位了,這裏咱們要變通一下,直接用999 - 922,而後在結果前面加個負號:999 - 922 = 77,咱們直接在77前面加個負號,-77就是正確結果啦,這樣咱們就能夠避開借位問題啦。blog

二進制如何表示負數呢?

二進制表示正負數時,通常會把最高位當作符號位,符號位0表示正數,1表示負數,那麼-1用二進制怎麼表示呢?ci

1用二進制表示爲00000001,因此推算一下-1應該就是10000001吧?get

讓咱們來驗證一下,看看對不對,十進制 1 +(-1)= 0,二進制 00000001 + 10000001 = 10000010 很明顯不等於0 啊。

咱們知道二進制1是00000001,那麼咱們倒推一下,00000001加上什麼數會等於00000000呢?

想來想去都想不到啊,不知道你有沒有發現,計算機是沒有減法運算的,計算機的減法是經過加法實現的,那麼加法怎麼能達到減法的效果呢?

咱們看下這個例子:

1 00000000超出了一個字節的範圍,最高位1被捨棄,剩下的就是 00000000,這就是十進制的0啊,推理可得-1用二進制表示就是11111111,好神奇。

「原來二進制的負數表示叫作補碼,補碼的轉換規則是正數的取反再加1」,好比:00000001 取反就是 11111110,而後再加1就是11111111,這就是-1的二進制表示了。

「仔細想一想所謂補碼,就是加起來等於11111111的碼啊,而後再加1,最高位溢出後,不就等於0了嗎,一個和原來的數加起來等於0的數不就是它的負數嗎?」 

這麼想是否是就容易理解了呢?

換個角度看看,-174的補碼就是(999-174)+ 1 = 826 ,174 +(-174)其實就是 174 + 826 = 1000 ,而後捨棄掉前面的1,結果就是0了,因此補碼就是加起來會向高位進一位的數。

下面,咱們來看看補碼的定義:

「補碼」(英語:2's complement)是一種用二進制表示有號數的方法,也是一種將數字的正負號變號的方式,常在計算機科學中使用。補碼以有符號比特的二進制數定義。


正數和0的補碼就是該數字自己。負數的補碼則是將其對應正數按位取反再加1。


補碼系統的最大優勢是能夠在加法或減法處理中,不需由於數字的正負而使用不一樣的計算方式。只要一種加法電路就能夠處理各類有號數加法,並且減法能夠用一個數加上另外一個數的補碼來表示,所以只要有加法電路及補碼電路便可完成各類有號數加法及減法,在電路設計上至關方便。


另外,補碼系統的0就只有一個表示方式,這和反碼系統不一樣(在反碼系統中,0有二種表示方式),所以在判斷數字是否爲0時,只要比較一次便可。

二進制減法

好了,咱們知道了補碼的概念以後,再來看看二進制數的減法。

大數減少數

251-174 轉換成二進制就是 11111011 - 10101110 ,還記得咱們上面不用借位的公式嗎?

251 + (999 - 174)+ 1 - 1000 = 77 ,其中 「(999 - 174)+ 1」就是-174的補碼,對應二進制10101110的補碼就是先取反01010001,而後再加1,01010001 + 1 = 01010010

而後11111011 和補碼 01010010 相加,最高位超過8位,溢出了,直接去掉不要,就是最終結果01001101,即爲十進制的77。這樣經過補碼,就能把減法用加法實現了。

小數減大數

若是是174-251用二進制計算該怎麼辦呢?10101110 - 11111011 ,一樣的咱們先計算11111011的補碼:而後10101110再和補碼00000101相加:10110011的十進制是179,結果也不對啊,別急,由於174比251小,相減的結果確定是負數,計算機的負數是用補碼錶示的,因此10110011確定是表示一個補碼,「一個數補碼的補碼就是他本身」,至關於負負得正,咱們再計算10110011的補碼:獲得01001101,十進制是77,一個數的補碼是77那麼這個數確定就是-77啦,因此10110011表示的是-77的補碼,而不是179。

最後的話

最重要的是,咱們要知道補碼的概念,以及補碼的轉換規則「「正數的取反再加1」」。

計算機巧妙的用補碼來表示負數,而後經過和一個負數(補碼)相加,來實現減法的操做。

例如:把減法251-174 變成 251 + (-174)的加法操做,這種把減法變成加法的操做,是否是很神奇呢?





本文分享自微信公衆號 - 編程我也會(zhanyingda)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索