計(jì)算機(jī)憑啥用二進(jìn)制

不管是不是程序員,大家可能都知道二進(jìn)制是個(gè)什么東西。

包括計(jì)算機(jī)在內(nèi),幾乎所有電子設(shè)備都采用的二進(jìn)制。

可是,為什么會(huì)這樣呢?

 

程序員上下50年

 

在說這個(gè)問題之前,先解決另一個(gè)問題——為什么大多數(shù)國家的人類都采用十進(jìn)制?

 

程序員上下50年

 

因?yàn)?,人類有十根手指?/span>

然后,沒了。

 

程序員上下50年

 

當(dāng)然,在人類文明發(fā)展的長河中,也誕生過一些其他的進(jìn)制。

 

比如蘇美爾人使用十二進(jìn)制,據(jù)說是通過大拇指點(diǎn)其他四根手指的指節(jié)得出的。

還有瑪雅人的二十進(jìn)制,大概率就是還算上了腳趾。

古巴比倫用六十進(jìn)制,難道是五根手指搭配十二個(gè)指節(jié)?

 

程序員上下50年

 

根據(jù)人類選擇計(jì)數(shù)方法的進(jìn)制,不難發(fā)現(xiàn),人類總是根據(jù)身邊最直接的物品來確定進(jìn)制。

如果人類只有七根手指,那估計(jì)我們就該用七進(jìn)制了。

 

程序員上下50年

 

對人類如此,對機(jī)器也是如此。

人類有手,機(jī)器有開關(guān)。

 

開關(guān)只有“接通”和“斷開”兩種狀態(tài),正好跟“1”“0”對應(yīng)。

于是,機(jī)器用二進(jìn)制便成了天經(jīng)地義的事情。

 

程序員上下50年

 

僅僅是表示一個(gè)數(shù)據(jù)的話,二進(jìn)制似乎只要增加位數(shù)就能做到。

但要命的來了。數(shù)字不光有正數(shù)和0的存在,還有負(fù)數(shù)。

 

程序員上下50年

 

于是,人們就把最高位拿出來表示符號(hào)。

正數(shù)用“0”,負(fù)數(shù)用“1”。

用這種方式表示的數(shù)字叫做機(jī)器數(shù)。也叫做原碼。

比如

+3原碼是0000 0011

-5原碼是1000 0101

8bit原碼數(shù)值范圍為[1111 1111,0111 1111]即[-127,127],共255個(gè)數(shù)字。

 

程序員上下50年

 

看起來似乎很方便,然而,當(dāng)進(jìn)行不同符號(hào)的加法或同符號(hào)減法運(yùn)算的時(shí)候,麻煩來了。

原碼的運(yùn)算不能直接判斷結(jié)果的正負(fù),需要比較兩個(gè)數(shù)值的絕對值,由絕對值大的值來決定符號(hào)。

 

比如

“+3”+“-5”

1000 0101絕對值0000 0101

0000 0011絕對值0000 0011

符號(hào)相反的加法即是絕對值的減法

所以結(jié)果的絕對值為0000 0010(2)

再看符號(hào),1000 0101絕對值大于0000 0011

所以結(jié)果應(yīng)該為1000 0010(-2)

所以“+3”+“-5”=“-2”

 

程序員上下50年

 

很復(fù)雜對不對?

不光人覺得麻煩,機(jī)器也覺得麻煩。

于是,便有了反碼。

 

那么,反碼是什么呢?

正數(shù)的反碼原碼一致

負(fù)數(shù)的反碼是將原碼除符號(hào)位以外所有位取反。

比如

+3反碼是0000 0011

-5反碼是1111 1010

8bit反碼數(shù)值范圍為[1000 0000,0111 1111]即[-127,127] ,共255個(gè)數(shù)字。

 

程序員上下50年

 

那,反碼有什么好處呢?

同樣,“+3”+“-5”

0000 0011 + 1111 1010 = 1111 1101(-2反碼)

是不是簡單多了?

 

但,還是有一個(gè)問題。這個(gè)問題是從原碼遺留下來的。

無論原碼還是反碼,0有正負(fù)兩種0

0000 0000(原碼 +0)

1000 0000(原碼 -0)

0000 0000(反碼 +0)

1111 1111(反碼 -0)

這個(gè)問題又該怎么解決呢?

于是,便終于有了補(bǔ)碼。

 

程序員上下50年

 

補(bǔ)碼是這么表示的:

正數(shù)的補(bǔ)碼依然是原碼

負(fù)數(shù)的補(bǔ)碼是將原碼除符號(hào)位外各位取反,之后+1。

也就是將反碼+1

比如

+3補(bǔ)碼是0000 0011

-5補(bǔ)碼是1111 1011

 

程序員上下50年

 

雖然有點(diǎn)難理解,但是采用補(bǔ)碼之后,不光解決了計(jì)算問題,還把正負(fù)零的問題規(guī)避了。

除了這兩點(diǎn),補(bǔ)碼還能比原碼和反碼多表示一個(gè)數(shù)字。

8bit補(bǔ)碼數(shù)值范圍為[1000 0000,0111 1111]即[-128,127] ,共256個(gè)數(shù)字。

 

當(dāng)“+3” + “-5”時(shí)

0000 0011 + 1111 1011 = 1111 1110(-2補(bǔ)碼)

0只剩下了0000 0000這一種表示方法。

反碼的1111 1111現(xiàn)在是補(bǔ)碼中-1。

反碼的1000 0000(-127)也就成了補(bǔ)碼可以多表示的-128。

 

程序員上下50年

 

因此,在計(jì)算機(jī)系統(tǒng)中,數(shù)值一律用補(bǔ)碼來表示和存儲(chǔ)。

 

如今,計(jì)算機(jī)固然已經(jīng)十分強(qiáng)大,但別忘記,是人類的智慧賦予的這一切。

 

程序員上下50年
程序員上下50年

 

好了,那么我們這一期的內(nèi)容到這里就結(jié)束了。