計算機之機器數,真數,原碼,反碼,補碼

機器數


一個數在計算機中的表現形式叫做機器數,這個數有正負之分,在計算機中用一個數的最高位(符號位)用來表示它的正負,其中0表示正數,1表示負數。

例如正數7,在計算機中用一個8位的二進制數來表示,是00000111,而負數-7,則用10000111表示,這裏的00000111和10000111是機器數

 

真數


計算機中的機器數對應的真實的值就是真數,對最高位(符號位)後面的二進制數轉換成10進制,並根據最高位來確定這個數的正負。對於上面的00000111和10000111來說,對最高位後面的二進制數轉換成10進制是7,在結合最高位的值,得出對應的真數分別是7和-7

 

原碼


用第一位表示符號,其餘位表示值。因爲第一位是符號位,所以8位二進制數的取值範圍就是:[1111_1111 , 0111_1111]  即 [-127 , 127] ,原碼是容易被人腦所理解的表達方式

反碼


正數的補碼反碼是其本身,負數的反碼是符號位保持不變,其餘位取反。例如正數1的原碼是[0000_0001],它的反碼是是其本身

[0000_0001],-1的原碼是[1000_0001],其反碼是[1111_1110]

補碼


正數的補碼是其本身,負數的補碼是在其反碼的基礎上+1,例如正數1的原碼是[0000_0001],他的補碼是其本身[0000_0001],

-1的補碼是[1111_1111]

有了原碼爲什麼要使用反碼和補碼


因爲人腦可以知道第一位是符號位,可以根據符號位對真值的絕對值進行加減乘除,但是對於計算機來說,加減乘除是最最最基本的運算,要設計的儘量簡單,計算機辨別符號位會讓計算機的設計電路變得很複雜,於是人們想出了讓符號位也參與到運算上來。減去一個數,等於加上他的負數。

使用原碼參數運算的缺陷

從上面的原碼錶中可以看見左邊每增加一個二進制單位對應的真數是遞減的,而右邊每增加一個二進制單位對應的真數是遞增的,所以對於原碼來說,能滿足正數的加法,但無法滿足負數的加法

2+1 = [0000_0010]原+[0000_0001]原=[0000_0011]原 = 3

1+-1=[0000_00001]原+[1000_0001]原=[1000_0010]原=-2

爲了滿足負數對加法的需求,就必須讓負數與他對應的二進制碼是同步遞增或者同步遞減

於是就通過符號位不變,其餘位取反來滿足這個同步遞增或者遞減的要求,由於正數本來就滿足它本身的加法,所以不需要做任何改變。這就是反碼的定義由來。

從上圖的反碼錶中可以看到在運算不跨過0的時候,正負數的加法已經能滿足要求

-2+1=[1111_1101]反+[0000_0001]反=[1111_1110]反=-1

127+1=[1000_0000]反=-127=128 加法算出來是128,由於128超過最大值,餘1,所以取最小值開始的第一位,也就是

最小值-127,但是這裏有個不合理的地方,就是[1111_1111]和[0000_0000]都表示0,這導致在實際計算中每當跨過0一次,就有一個單位的誤差

-1+2=[1111_1110]反+[0000_0010]反=[0000_0000]反=0

要解決這個問題就必須讓反碼中的[1111_1111]和[0000_0000]合併,

由於[1111_1111]+[0000_0001]=[0000_0000],所以在負數反碼的基礎上+1就可以解決反碼中跨0的誤差問題,同時不會對負數與它對應的二進制反碼的同步遞增產生影響,所以在反碼的基礎上+1就完美的解決了符號參與預算的問題,這就是補碼爲什麼是在負數反碼的基礎上+1的由來。

從上面的圖中發現還有一個[1000_0000]的二進制沒有對應任何真數,於是就規定了這個數的真數是-128

所以補碼的表示範圍是[-128~127] ,這樣一來256個二進制正好表示256個整數,在實際二進制的運算中超過範圍其實就是對256的取餘運算(x+128)mod 256 - 128。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章