計算機組成原理中源碼、反碼、補碼存在意義


一、為什么需要反碼?

反碼的作用就相當於數學中的負數。

對於小學生來說,會做的算術題是:5-3,但是不會做3-5。於是,我們上初中的時候,數學里就引進了一個新的概念:負數。引入負數之后,本來是減法的運算就可以變成加法來實現:

3-5=3+[-5]=[-2],中括號代表“負數”,“負數”就是我們人為給出的數學術語。

 

對於計算機來說,會做的算術題是:5+3,但是不會做3-5。於是,我們就在編碼里引進了一個新的概念:反碼。引入反碼之后,本來是減法的運算就可以變成加法來實現:

3-5=3+[-5]=[-2],中括號代表“反碼”,“反碼”就是我們人為給出的計算機術語。

 

這里,你一定有一個疑問:為什么計算機只會做5+3,不會做3-5。這是因為在計算機的數字電路中只有加法器,沒有所謂的“減法器”。不是說計算機廠商不會設計減法器,因為聰明的人既然發明了方法能夠用加法來實現減法操作,那為什么還需要畫蛇添足的弄一個減法器?

 

接着說:那么反碼要怎么定義才能實現減法變加法的功能呢?聰明的人想的辦法如下:

1.正數反碼保持原碼不變:3=[0_0000011]

2.負數除最高位(正負符號位)外,全部取反(0變1,1變0):-5=1_0000101取反=[1_1111010]

於是3+[-5]=[-2]的計算過程為:

[0_0000011]+[1_1111010]=[1_11111101]

這樣,這種反碼方法就成功實現了目標!至於為什么,我想只有數學家能給出解釋了。

 

二、為什么需要補碼?

都是因為“0”這個特殊數字的存在。

先問你一個問題:0是正數還是負數?你肯定會說:0既不是正數也不是負數,這是我們初中學到的數學知識。這個回答沒有問題,所以以后每次碰到0,人們都不會把它當正數或負數。

那么計算機呢?計算機不同於人腦,計算機在碰到任何數字之前只根據最高位的符號位來判斷正負性,“0”表示正數,“1”表示負數。

 

前面我們推論了為何要用反碼,那么用8位二進制反碼表示的正數范圍: +0 —— +127;負數范圍: -127 —— -0。但是,其中有兩個特殊的編碼會出現:

[0_0000000]=+0 (反碼)

[1_1111111]=-0 (反碼)

 

其實,+0和-0代表的都是0。這樣一來,“0”這個數字在計算機中的編碼就不是唯一的了。對於計算機來說,這是絕對不行的,因為任何數字都只能有1個編碼。

於是,聰明的人就做了這樣一個決定:把0當成正數,也即+0,這樣0的編碼就變成:0_0000000。那8位二進制表示的正數范圍仍然是: +0 —— +127。

但是,對於負數就必須要做調整,也即-0必須要讓位---1_1111111這個編碼不能表示-0。我們可以把負數整體向后“挪動1位”:只要將8位二進制表示的負數范圍從:-127 —— -0變成:-128 —— -1,就能成功解決問題。

 

那么怎么整體挪動1位呢?方法就是反碼+1。{1_1111111}編碼就不再表示-0,而變成了-1。順着推,最小的編碼{1_0000000}就是-128。

我們給這個反碼+1又人為的取了一個新的名字,叫補碼。於是乎,補碼的定義如下:

 

1.正數補碼保持原碼不變:3={0_0000011}

2.負數先求反碼,然后再加1:-5=[1_1111010]+1={1_1111011}

於是3+{-5}={-2}的計算過程為:

{0_0000011}+{1_1111011}={11111110}

 

至此,通過補碼就成功解決了數字0在計算機中非唯一編碼的問題,且也能實現減法變加法。

所以,在計算機的世界里,0是正數。這點和我們學的數學不一樣。

{0_1111111}=+127 (補碼)

{0_0000000}=+0 (補碼)

{1_1111111}=-1 (補碼)

{1_0000000}=-128 (補碼)

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM