計算機中的數是用二進制來表示。數的符號也是用二進制表示的。在機器中,把一個數連同其符號在內數值化表示的數成爲機器數。機器數能夠用不一樣的碼制來表示,經常使用的有原碼、補碼、反碼錶示法。通常用最高有效位表示數的符號,正數用0表示,負數用1表示。post
原碼由真值得來,真值(人理解的數 +3 -3 +1.5 -1.5)是一個變量自己所具備的真實值,是一個理想概念,通常沒法獲得。spa
整數 | +5D | -5D |
1 取絕對值 | [+5]真值→|+5|=5 | [-5]真值→|-5|=5 |
2 化二進制 | (5)10=(0101)2=0101B | (5)10=(0101)2=0101B |
3 加正負號(此時位機器真值) | 0101B加符號 → +0101B機器真值 | 0101B加符號 → -0101B機器真值 |
4 標準化blog (符號位正爲0負爲1,尾數外中間補0)get |
+0101B=0 000 0101B | -0101B=1 000 0101B |
[+5]原碼=0 000 0101B | [-5]原碼=1 000 0101B |
純小數 | +0.8125D | -0.8125D |
1 取絕對值 | |+0.8125|=0.8125 | |-0.8125|=0.8125 |
2 化二進制 | (0.8125)10=(0.1101)2=0.1101B | (0.8125)10=(0.1101)2=0.1101B |
3 加正負號 | 0.1101B加符號 → +0.1101 | 0.1101B加符號 → -0.1101B機器真值 |
4 標準化it (符號位正爲0負爲1,右補足8位)io |
+0.1101B=0.1101 000B | -0.1101B=1.1101 000B |
[+0.8125]原碼=0.1101 000B | [-0.8125]原碼=1.1101 000B |
純小數表示範圍爲(-1,1),因此8位0.1101 000B存儲爲0110 1000,並不會和0110 1000表示的整數衝突table
正數 原碼、反碼、補碼 同樣基礎
負數 反碼在原碼基礎上,符號位不變,其餘位按位取反變量
整 | 正 | [+5]反=[+5]補=[+5]原=0 000 0101B | |
負 | [-5]原= 1 000 0101 B | [-5]補=[-5]反+1=111 1011B擴展 末位加一 |
|
符號位不變↓↓其他按位取反 | |||
[-5]反= 1 111 1010 B | |||
小 | 正 | [+0.8125]反=[+0.8125]補=[+0.8125]原=0.1101 000 B | |
負 | [-0.8125]原=1.1101 000 | [-0.8125]補=[-0.8125]反+0.000 0001 =1.001 0111+0.000 0001=1.001 1000 |
|
符號位不變↓↓其他按位取反 | |||
[-0.8125]反=1.0010 111 |
補碼錶示法中,
正數採用 符號-絕對值 表示,即數的最高有效位爲0表示正,數的其他部分則表示數的絕對值
機器字長8位:
[+1]補 = 0 000 0001
[+127]補 = 0 111 111
[+0]補 = 0000 0000
補碼錶示負數,n位機器字長表示負數X爲 2n-|X|
機器字長8位:
[-1]補 = 28-1 = 1 111 1111
[-127]補 = 28-127 = 1 000 0001
[-0]補 = 28-0 = 0000 0000
注意
補碼錶示法中0只有一種表示即 0000 0000
對於1000 0000,在補碼錶示法中被定義爲 -128
8位 | 原碼 | 反碼 | 補碼 |
+0 | 0000 0000 | 0000 0000 | 0000 0000 |
-0 | 1000 0000 | 1111 1111 | 1 0000 0000 cf=1 |
範圍 | -127D˜127D | -127D˜127D | -128D˜127D |
8位能夠表示28個不一樣的數,+0和-0補碼都是0000 0000,空一個表示-128
正數
原碼、反碼、補碼 同樣
負數
法一:補碼在反碼基礎上,末位加一
整 | 正 | [+5]反=[+5]補=[+5]原=0 000 0101B | |
負 | [-5]原= 1 000 0101 B | [-5]補=[-5]反+1=111 1011B 末位加一 |
|
符號位不變↓↓其他按位取反 | |||
[-5]反= 1 111 1010 B | |||
小 | 正 | [+0.8125]反=[+0.8125]補=[+0.8125]原=0.1101 000 B | |
負 | [-0.8125]原=1.1101 000 | [-0.8125]補=[-0.8125]反+0.000 0001 =1.001 0111+0.000 0001=1.001 1000 |
|
符號位不變↓↓其他按位取反 | |||
[-0.8125]反=1.0010 111 |
法二:對於一個正數的補碼錶示 按位求反後再在末位加一 能夠獲得與此正數相對於的負數的補碼錶示
機器字長爲8位 | 機器字長爲16爲 | |
-46D的補碼 | -117D的補碼 | |
1 先寫出與該數相對應的 正數的補碼錶示(符號-絕對值法) |
+46D的補碼錶示爲 0010 1110 |
+117D的補碼錶示爲 0000 0000 0111 0101 |
2 將其按位取反 | 1101 0001 | 1111 1111 1000 1010 |
3 在末位(最低位)加一 | 1101 0010 | 1111 1111 1000 1011 |
4 用十六進制表示 | D 2 | F F 8 B |
5 結果 | [-46]補 = D2H | [-117]補 = FF8BH |
定義
對於一個二進制數→按位求反→在末位加一 的運算稱爲求補運算
推理
補碼錶示的數具備如下特性:
[X]補 求補得› [-X]補 求補得› [X]補
[117]補=0075H | [-117]補=FF8BH | |
對[-117]補 做求補運算 |
[-117]補爲 | 1111 1111 1000 1011 |
按位求反後得 | 0000 0000 0111 0100 | |
末位加一後得 | 0000 0000 0111 0101 | |
[-117]補爲 | 0000 0000 0111 0101 |
補碼的加法規則:
[X+Y]補 = [X]補 + [Y]補
補碼的減法規則:
[X-Y]補 = [X]補 + [-Y]補
其中[-Y]補 只要對[Y]補求補就可獲得
[Y]補 → 因此位按位取反 → 末位加一 → [-Y]補
十進制 | 二進制 | ||
+25 | 0001 1001 | ||
+ | +32 | + | 0010 0000 |
= | 57 | = | 0011 1001 |
+32 | 0010 0000 | ||
+ | -25 | + | 1110 0111 |
= | 7 | = | 0000 0111 |
↓1 | |||
-25 | 1110 0111 | ||
+ | -32 | + | 1110 0000 |
= | -57 | = | 1100 0111 |
↓1 | |||
25 | 0001 1001 | ||
+ | -32 | + | 1110 0000 |
= | -7 | = | 1111 1001 |
十進制 | 二進制 | ||||
25 | 0001 1001 | 0001 1001 | |||
- | 32 | - | 0010 0000 | + | 1110 0000 |
= | -7 | 對減數求補換成加法 | = | 1111 1001 | |
-25 | 1110 0111 | 1110 0111 | |||
- | -32 | - | 1110 0000 | + | 0010 0000 |
= | 7 | 對減數求補換成加法 | = | 0000 0111 | |
↓1 |
符號擴展是指一個數從位數較少擴展到位數較多(如從8爲擴展到16位,或從16位擴展到32位)
補碼錶示數的符號擴展,對於補碼錶示的數,正數的符號擴展應該在前面補0,而負數擴展則應該在前面補1
機器字長爲8位 | [+46]補= 0010 1110 | [-46]補= 1101 0010 |
擴展到16位 | [+46]補= 0000 0000 0010 1110 | [-46]補= 1111 1111 1101 0010 |
通常來講n位補碼錶示的數的表示範圍是 -2n-1 ≤ N ≤ 2n-1-1
8位二進制數能夠表示28=256個數,當他們是補碼錶示帶符號數時,他們表數範圍爲-128 ≤ N ≤ +127
n=16時的表數範圍是-32768 ≤ N ≤ +32767
爲了擴大表數範圍,在機器裏,能夠用二個機器字(低位字和高位字)來表示一個機器數,這種數稱爲雙字長數或雙精度數,其中高位字的最高有效位爲符號位。
機器字長爲16位爲例,高位字的低15位和整個低位字的16位聯合組成31位數來表示數值,於是低位字的最高有效位沒有符號意義只有數值意義,雙字長數的表數範圍可擴大到 -231 ≤ N ≤ 231-1
15 | 14 0 | 15 0 |
符號 | 高位字 | 低位字 |
補碼值 |