【程序員上下50年】計算機憑啥用二進制
計算機憑啥用二進制
不管是不是程序員,大家可能都知道二進制是個什么東西。
包括計算機在內,幾乎所有電子設備都采用的二進制。
可是,為什么會這樣呢?

在說這個問題之前,先解決另一個問題——為什么大多數國家的人類都采用十進制?

因為,人類有十根手指。
然后,沒了。

當然,在人類文明發展的長河中,也誕生過一些其他的進制。
比如蘇美爾人使用十二進制,據說是通過大拇指點其他四根手指的指節得出的。
還有瑪雅人的二十進制,大概率就是還算上了腳趾。
古巴比倫用六十進制,難道是五根手指搭配十二個指節?

根據人類選擇計數方法的進制,不難發現,人類總是根據身邊最直接的物品來確定進制。
如果人類只有七根手指,那估計我們就該用七進制了。

對人類如此,對機器也是如此。
人類有手,機器有開關。
開關只有“接通”和“斷開”兩種狀態,正好跟“1”“0”對應。
于是,機器用二進制便成了天經地義的事情。

僅僅是表示一個數據的話,二進制似乎只要增加位數就能做到。
但要命的來了。數字不光有正數和0的存在,還有負數。

于是,人們就把最高位拿出來表示符號。
正數用“0”,負數用“1”。
用這種方式表示的數字叫做機器數。也叫做原碼。
比如
+3原碼是0000 0011
-5原碼是1000 0101
8bit原碼數值范圍為[1111 1111,0111 1111]即[-127,127],共255個數字。

看起來似乎很方便,然而,當進行不同符號的加法或同符號減法運算的時候,麻煩來了。
原碼的運算不能直接判斷結果的正負,需要比較兩個數值的絕對值,由絕對值大的值來決定符號。
比如
“+3”+“-5”
1000 0101絕對值0000 0101
0000 0011絕對值0000 0011
符號相反的加法即是絕對值的減法
所以結果的絕對值為0000 0010(2)
再看符號,1000 0101絕對值大于0000 0011
所以結果應該為1000 0010(-2)
所以“+3”+“-5”=“-2”

很復雜對不對?
不光人覺得麻煩,機器也覺得麻煩。
于是,便有了反碼。
那么,反碼是什么呢?
正數的反碼跟原碼一致。
負數的反碼是將原碼除符號位以外所有位取反。
比如
+3反碼是0000 0011
-5反碼是1111 1010
8bit反碼數值范圍為[1000 0000,0111 1111]即[-127,127] ,共255個數字。

那,反碼有什么好處呢?
同樣,“+3”+“-5”
0000 0011 + 1111 1010 = 1111 1101(-2反碼)
是不是簡單多了?
但,還是有一個問題。這個問題是從原碼遺留下來的。
無論原碼還是反碼,0有正負兩種0
0000 0000(原碼 +0)
1000 0000(原碼 -0)
0000 0000(反碼 +0)
1111 1111(反碼 -0)
這個問題又該怎么解決呢?
于是,便終于有了補碼。

補碼是這么表示的:
正數的補碼依然是原碼
負數的補碼是將原碼除符號位外各位取反,之后+1。
也就是將反碼+1。
比如
+3補碼是0000 0011
-5補碼是1111 1011

雖然有點難理解,但是采用補碼之后,不光解決了計算問題,還把正負零的問題規避了。
除了這兩點,補碼還能比原碼和反碼多表示一個數字。
8bit補碼數值范圍為[1000 0000,0111 1111]即[-128,127] ,共256個數字。
當“+3” + “-5”時
0000 0011 + 1111 1011 = 1111 1110(-2補碼)
0只剩下了0000 0000這一種表示方法。
反碼的1111 1111現在是補碼中-1。
反碼的1000 0000(-127)也就成了補碼可以多表示的-128。

因此,在計算機系統中,數值一律用補碼來表示和存儲。
如今,計算機固然已經十分強大,但別忘記,是人類的智慧賦予的這一切。


好了,那么我們這一期的內容到這里就結束了。

