為什么需要補碼
在真實世界里,常常需要負數(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ù)

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中不需要減法器電路以減少設計成本。