計算機二進制補碼為什么是原碼取反加一

為什么需要補碼

在真實世界里,常常需要負數(shù)。如果存儲在存儲設備中的最小值為0,那么計算機如何存儲負數(shù)呢?這個問題不是存儲問題,而是程序設計人員的解釋問題,類似這樣的問題在后邊的存儲設備中也存在( 關注下一篇)

百科概念

計算機中的符號數(shù)有三種表示方法,即原碼、反碼和補碼。三種表示方法均有符號位和數(shù)值位兩部分,符號位都是用0表示“正”,用1表示“負”,而數(shù)值位,三種表示方法各不相同。
在計算機系統(tǒng)中,數(shù)值一律用補碼來表示和存儲。原因在于,使用補碼,可以將符號位和數(shù)值域統(tǒng)一處理;同時,加法和減法也可以統(tǒng)一處理。此外,補碼與原碼相互轉換,其運算過程是相同的,不需要額外的硬件電路。

從百科解釋來看是為了減少硬件電路設計,這是最終目的。從設計目的來看實在感慨設計師的巧妙。

下面我們分析一下,為什么原碼取反加一就能夠減少硬件電路,換句話說,為什么取反加一就可以將減法轉化為加法?

定義和原理

從百科來看,給補碼下個定義比較困難,就好比解釋什么是筷子一樣。我們可以拋開計算機,從人類社會數(shù)學的概念出發(fā),給補碼定義如下:
所謂補碼就是某個數(shù)n,這個數(shù)加上-n=0。這也是補碼的基本原理。
我們將二進制的首位為0解釋為正數(shù),1解釋為負數(shù)

補碼.jpg
13    00001101
-13   11110011(補碼)
---------------
    1 00000000

直接從以上等式來看,13和-13之間除了符號位不一樣,其實位之間并無關系。而實際上他們之間的關系十分微妙。
這里可能有人會想,為什么不直接將符號位取反即表示負數(shù)?比如+13(+一般省略)和-13在十進制中就是符號不一樣。

理論上單純從解釋的角度出發(fā)沒有問題

00001101 (+13)
10001101 (-13)

但無法將該種解釋通過加法來實現(xiàn)減法.(因為二進制相加之后不為0)

那么這種微妙的關系是什么呢?

通過補碼的定義
n+(-n)=0
這里的(-n)即為補碼.我們反推過來,這里n已知,0已知(00000000).
如何求-n?
我們知道給定一個數(shù)n,讓這個數(shù)變?yōu)?有兩種辦法

  • 做減法,將這個數(shù)的每一位減1,這個辦法在百科的概念中可以被否決,因為要增加硬件成本.
  • 做加法,讓結果溢出后即為0

根據(jù)第二種辦法我們得出
最大的數(shù)+1即可溢出為0

那么n+(-n)=0 成立,-n推導如下

已知
   0=(11111111+1)

   11111111
          1
------------
 1 00000000
=> 

n+(-n)=(11111111+1)
已知
    n|~n=11111111
    n+(-n)=(n|~n)+1
    n+(-n)=(n+~n)+1(二進制按位或即按位相加)
=>
    (-n)=~n+1 (等號兩個n抵消)

總結

通過以上分析,真的感慨計算機大師的微妙設計。
通過數(shù)學的巧妙設計使cpu中不需要減法器電路以減少設計成本。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容