原碼、反碼和補碼
真值:是帶有正負號的二進位制表示數。
機器數:乙個數在計算機中的表現形式,機器數是帶有符號的,在計算機中用乙個數的最高位表示符號,0為正,1為負。
原碼:是符號位加上真值的絕對值,和機器數一樣。如果是八位二進位制的表示範圍是:
[11111111~01111111]也就是[-127~127]。
原碼是人腦最容易理解和計算的表示方式。
反碼:正數的反碼是其本身,負數的反碼是符號位不變,其餘各位取反。
補碼:正數的補碼是其本身,負數的補碼是符號位不變,其餘各位取反,最後加1(也就是反碼+1)。
計算機中負數採用補碼表示
計算機讓符號位參與運算,用加法代替減法。
可以將減法變為加法,省去了減法器。無符號及帶符號的加法運算可以用同一電路完成。有符號和無符號的加減,其實都是把它們的真值拿過來相加。真值,也就是乙個數值在計算機中的二進位制表示。正數的真值就是其原碼,負數的真值是其補碼。所以,有符號和無符號由編譯器控制,計算機要做的不過是把兩個真值拿過來相加。如果用原碼來進行減法計算,計算十進位制的表示式: 1-1=0。
1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2
計算結果不正確。
如果用反碼來計算十進位制的表示式: 1-1=0。
1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0
發現用反碼計算得到了正確的真值部分,但是0帶符號位是沒有意義的。最後導致會有兩個編碼表示0。
如果用補碼來計算十進位制的表示式: 1-1=0。
1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]補 + [1111 1111]補 = [0000 0000]補=[0000 0000]原=0
用補碼來計算就可以避免結果不正確以及-0的問題。因此用補碼來計算,0就是用[00000000]補來表示,規定將[10000000]補來表示-128。
因此八位二進位制補碼的表示範圍是[-128,127]。
int,short,long,long long,unsigned int表示範圍
在32位計算機中:int是32位的,因為機器是使用補碼方式進行編碼,所以int的表示範圍是[-2^31,2^31-1],如上面所述,用0x80000000表示-2^31。
unsigned int 是32位,無符號位,表示範圍是[0,2^32-1]。
long 是32位,有符號位,和int表示範圍一致。
long long 是64位,有符號位,實現了32位計算機的位擴充套件。表示範圍[-2^63,2^63-1]。
short 是16位,有符號位,表示範圍[-2^15,2^15-1]
在64位計算機中:int 32位
long 64位
long long 64位
補碼的表示範圍 計算機的原碼 反碼和補碼
資料在計算機裡面都是以0和1儲存和運算的,這是馮諾依曼體系的基礎。比如乙個數在計算機中若有正負之分,則用乙個數的最高位 符號位 用來表示它的正負,其中0表示正數,1表示負數。原碼就是整數絕對值的二進位制形式,為了解決計算機中有負數的運算,提出了反碼 補碼。原碼就是符號位加上真值的絕對值,第一位表示符...
計算機組成浮點數補碼規格化負數表示範圍
推理 關於浮點數的表示與運算章節中,補碼規格化後的負數所能表示的範圍 一 記住形式1.0xx,現要找最大的負數 二 假設現在僅4位 符號位佔一位 毫無疑問就是 0.001,原碼表示就是1.001 最低位為0時 0在原碼中也是0 可是然後規格化得1.111,不符合形式 三 推理 這個數取反 1要變成1...
資訊傳遞 編碼和計算機表示(二)
數字計算機的世界就是0和1,所以一切要通過計算機進行計算和表達的資訊都必須編碼成0 1串。那麼計算機中如何表示阿拉伯數字,英文本母 希臘字母 拉丁字母 中文字元 數學符號等呢。下面講解計算機中如何對這些進行編碼,以及現實中編碼出現的歷史。按照先後順序,計算機字元編碼先後出現的是 ascii exte...