最近花了點時間對計算機的原碼,反碼和補碼進行了研究,對為什麼要有反碼和補碼以及他們這麼設計的原因有了一定的理解
乙個數在計算機中的表現形式叫做機器數,這個數有正負之分,在計算機中用乙個數的最高位(符號位)用來表示它的正負,其中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。
計算機原碼 反碼 補碼理解
計算機使用一定的編碼方式進行儲存,原碼 反碼 補碼是機器儲存乙個具體數字的編碼方式 1 原碼 第一位表示符號 正數第一位為0,負數第一位為1,其餘位表示值 以8位二進位制表示 1 原碼 0000 0001 1 原碼 1000 0001 第一位為符號位 正負數符號位 所以8位二進位制原碼範圍為 111...
計算機的原碼,反碼,補碼的理解
在學習原碼,反碼和補碼之前,需要先了解機器數和真值的概念.在探求為何機器要使用補碼之前,讓我們先了解原碼,反碼和補碼的概念.對於乙個數,計算機要使用一定的編碼方式進行儲存.原碼,反碼,補碼是機器儲存乙個具體數字的編碼方式.原碼 原碼就是符號位加上真值的絕對值,即用第一位表示符號,其餘位表示值.比如如...
計算機 原碼 反碼 補碼
在計算機中,用補碼來表示數字,因為 1 這樣可以比較方便的表示0 保證0作為正數或者負數補碼都是00000000 2 計算時用補碼直接加減就是最終數值 符號位參與運算 1.原碼 原碼就是符號位加上真值的絕對值,即用第一位表示符號,其餘位表示值.比如如果是8位二進位制 1 原 0000 0001 1 ...