計算機原碼,反碼,補碼

2021-10-01 22:45:21 字數 2176 閱讀 2096

最近花了點時間對計算機的原碼,反碼和補碼進行了研究,對為什麼要有反碼和補碼以及他們這麼設計的原因有了一定的理解

機器數

乙個數在計算機中的表現形式叫做機器數,這個數有正負之分,在計算機中用乙個數的最高位(符號位)用來表示它的正負,其中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=[0111_1111]反+[0000_0001]反=[1000_0000]反=-127(發生溢位)

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

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

由於[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 保證0作為正數或者負數補碼都是00000000 2 計算時用補碼直接加減就是最終數值 符號位參與運算 1.原碼 原碼就是符號位加上真值的絕對值,即用第一位表示符號,其餘位表示值.比如如果是8位二進位制 1 原 0000 0001 1 ...

計算機原碼, 反碼, 補碼

乙個數在計算機中的二進位制表示形式,叫做這個數的機器數。機器數是帶符號的,在計算機用乙個數的最高位存放符號,正數為0,負數為1.因為第一位是符號位,所以機器數的形式值就不等於真正的數值。例如上面的有符號數 10000011,其最高位1代表負,其真正數值是 3 而不是形式值131 10000011轉換...

計算機基礎 原碼 補碼 反碼

最近工作中用到了,補碼的概念,發現這些概念腦子裡全糊了 翻出書簡單複習一下,歸納如下 首先我們討論的都是有符號數,第一位都是符號位 正0 負1 原碼 最簡單明瞭 x 1101 x原碼 0,1101 x 1101 x原碼 1,1101 這裡注意下原碼0有兩種表示法 0原碼 0,0 0原碼 1,0 補碼...