本文將介紹計算機中四種編碼: 原碼,補碼,反碼,移碼的有關知識。
計算機需要處理的信息包括數值信息以及各種符號,文字,圖像語言等信息。但計算機內部的硬件只能表示兩個狀態0和1,計算機只能對二進制的數字信息進行傳送、處理。加工和存儲,因此,在計算機的內部,各種信息都必須經過數字化編碼后才能被傳送加工和處理,必須對這些信息進行編碼。
各種數值數據在計算機中的表示的形式成為機器數,其特點是采用二進制計數制,數的符號用0、1表示,小數點則隱含表示而不占位置。機器數對應的實際數值稱為數的真值。小數點位置固定的數稱為定點數,有無符號數和帶符號數之分。計算機中的定點數只采用純整數或者純小數形式。
無符號數表示正數,在機器數中沒有符號位。對于無符號數,若約定小數點的位置在機器數的最低位后,則是純整數;若約定小數點的位置在機器數的最高位之前,則是純小數。
對于帶符號數,n位機器數的最高位Xs是表示正負的符號位,其余n-1位則表示數值。若約定小數點的位置在機器數的最低數值位之后,則是純整數,若約定小數點的位置在機器數的最高位之前(符號位之后),則是純小數。
帶符號定點整數格式: Xs Xn-2 - - - X1 X0 .
帶符號頂點小數格式: Xs. Xn-2 - - - X1 X0
("."為小數點位置)
1.原碼表示
原碼(true form)是最容易理解的一種數據編碼表示,也稱“符號-數值”表示法。
數值X的原碼記為[X]原,如果機器字長為n(即采用n個二進制位表示數據),則最高位是符號位,0表示正號,1表示負號,其余n-1位表示數值的絕對值。數值0的原碼表示有兩種形式(假設n=8):
[+0]原=0 0000000,[-0]原=1 0000000
由于小數點約定的位置不同,計算機中的數據分為定點小數和定點整數,相應由兩種形式的原碼定義。
定點小數的原碼定義如下:
[X]原= X , 0<=X<1
1-X=1+|X| , -1<X<=0
式中X表示真值,[X]原表示真值X的原碼。若X為正,則[X]原與X相同;因為X為純小數,且0<=X<1,所以最高位(符號位)為0,若X為負,則[X]原為1+|X|,即最高位(符號位)為1,數值位為X的絕對值。課間原碼體現了數據的絕對值,因此在乘除運算中常采用原碼。
定點整數的原碼定義如下:
[X]原= X , 0<=X<2n-1
2n-1-X=2n-1+|X| , -2n-1<X<=0
例:若機器字長n=8
[+35]原=(00100011)2
[-35]原=27-(-35)=(10000000)2+(00100011)2=(10100011)2
[+0.8125]原=(0.1101000)2
[-0.8125]原=1-(-0.8125)=(1.0000000)2+(0.1101000)2=(1.1101000)2
由定義可以得出原碼的如下性質:
1.原碼表示法用最高位表示符號位,符號位為0表示正,1表示負。數值部分就是原來的數值,即絕對值的真值。
2.真值0在原碼表示中不唯一。由定義,[+0]原=0 0000000,[-0]原=1 0000000
3.假設機器字長為n,則
·原碼表示的定點小數,其表示范圍為: -(1-2-(n-1))~+(1-2-(n-1))
·原碼表示的定點小數,其表示范圍為:-(2n-1-1)~+(2n-1-1)
4.對于定點小數,當X>0時,0<[X]原<1,當X<0時,1<[X]原<2
對于n為定點整數,當X>0時,0<[X]原<2n-1,當X<0時,2n-1<[X]原<2n.
因此,負數的原碼大于整數的原碼。
5.由真值轉換為原碼,可將正數的符號位寫0,負數符號位寫1,數值位照寫即可;由原碼轉換為真值,則將符號位0寫成"+",1寫成"-",數值位不變即可。
+ <--->0 ,- <---->1
真值X <----------------------------->[X]原
數值位不變
原碼的優點:表示簡單直觀,機器數和真值間的相互轉換很容易。用原碼實現乘,除運算的規則很簡單,可取其絕對值(原碼的數值部分)直接運算,并遵循同號相乘除結果符號為正,異號為負的原則,單獨處理符號位。
缺點:實現加減運算較為復雜。
2.補碼表示
補碼概念的引入:
-3 = +9 ( MOD 12 )
一個負數可以表示成一個正數對于一個數M的補數。
補碼的定義:
設模為M,一個n為二進制數X的補碼的一般定義為:
[X]補= M + X (M為2n)
上式是一個包含正負數在內的統一定義式。
·若X>0,則模作為超出的部分將被舍去,[X]補=X,因而正數的補碼就是其本身。
·若X<0,則[X]補=M-|X|,[X]補就是|X|以M為模的補數。
定點小數的補碼定義如下:
[X]補= X=[X]原 ,0<=X<1
2+X = 2-|X| ,-1<=X<0 (MOD 2).
定點整數的補碼定義如下:
[X]補= X = [X]原 , 0<=X<2n-1
2n+X =2n-|X| , -1<=X<0 (MOD 2)
例: 設機器字長為8位
[-35]補=28+(-35)=(1 0000 0000)2-(0010 0011)2=(1101 1101)2
[-0.8125]補=2+(-0.8125)=(10.0000000)2-(0.1101000)2=(1.0011000)2
·補碼的性質:
1.補碼的符號位。
當0<=X<1時,[X]補=X,因此有0<=[X]補<1,可見[X]補的形式必然為0.xxxx...x,所以符號位S=0。
當-1<=X<0時,[X]補=2+X,因此有1<=[X]補<2,可見[X]補的形式必然為1.xxxx...x,所以符號位為S=1。
2.補碼中0的表示
[0]補=0,0的補碼是唯一的,因此X與[X]補一一對應。
3.補碼的表示范圍
假設字長為n,則用補碼表示定點小數,其范圍為 -1<=X<=+(1-2-(n-1)),用補碼表示定點整數,范圍為 -2-(n-1)<=X<=+(2n-1-1).
4.負數的補碼值大于整數的補碼值。
5.補碼與真值、原碼之間的相互轉換。
當真值X>=0時,
+ <-------> 0
真值X <----------------------------------> [X]補=[X]原
數值位不變
當真值X<0時,假設機器字長為n,由定義得:
[X]補=2+X=1.111111..1 + X + 0.000000..1=1.111111..1-|X| +0.00000...1
n個1 n-1個0 |X|按位取反 末位+1
由此可以得到負數X轉換為補碼的規則如下:將|X|的真值按位取反,末位+1。
反過來,由定義[X]補=2+X,得 -X=2-[X]補,又因為 -X=|X|,因此有
|X|= -X=2-[X]補=1.1111..1-[X]補+0.00000..1
[X]補按位取反 末位+1
而真值 X=-|X|,由此得出將負數X的補碼[X]補轉換為真值X的規則如下:將負數的補碼轉換為真值時,只需將符號位寫為負號"-",補碼的各位按位取反,末位+1即可。
當真值X<0時,
"-" <------->1
真值X <----------------------------------->[X]補
數值按位取反,末位加1
當真值X<0時,
符號位1不變
[X]原<------------------------------------>[X]補
數值按位取反,末位加一
另一種原碼轉換為補碼的簡便方法:數值部分自低位向高位搜索,第一個1以及其右的各位0保持不變,第一個1左邊的各位按位取反。
證明:設數值部分為 X X X... X 1 0..00
_ _ _ _
按位取反后為: X X X...X 0 1..11
_ _ _ _
末位+1: X X X...X 1 0..00
·補碼的符號位擴展:
在實際應用的過程中,有時需要擴充補碼的位數。
1.要將n位純小數補碼變成2n位,只需在末尾添加n個0即可。
這個很好理解,例如[X]補=0.0000001---->0.000000100000000
2.要將整數補碼的模擴大 2n 倍,只需將[X]補的符號位向左復制n位即可。
證明: [X1]補=2n+X ---> X=[X1]補-2n;
[X2]補=22n+ X --->[X2]補= 22n+ [X1]補-2n
將X代入
=2n·2n+ [X1]補-2n =(2n-1)·2n + [X1]補
合 并 n-1個1左移n位 加上[x1]補
·補碼的算術右移(除2運算)
算術右移就是除2運算,即已知[X]補,求[X/2]補。
符號位不變
結論: [X]補 ---------------------------------->[X/2]補
按位右移一位
證明: 若X>=0
[X]補 = X ----> X/2= [X]補/2,
[X/2]補 =[X]補/2; 即X>=0時補碼右移1位
若X<0
[X]補=2n+X --->X=[X]補-2n,--->X/2=[X]補/2-2n-1
[X/2]補= 2n + X/2 = 2n + [X]補/2 - 2n-1 = 2n-1 + [X]補/2.
1左移n-1位 [X]補右移一位
即X<0時[X/2]補為補碼右移1位+1<<(n-1)。
得證。
例: [X1]補=0.1101010 則[X1/2]補=0.0110101
[X2]補=1.0100110 則[X2/2]補=1.1010011
·補碼的算術左移
算術左移就是乘2運算,與算術右移損失精度不同算術左移可能產生溢出。
末位補0
結論: [X]補 <---------------------------------->[2X]補
各位左移1位
證明: [X]補= 2+X, X=[X]補-2.
2X=2[X]補-4 ,[2X]補=4 + 2X= 4 + 2[X]補-4 =2[X]補
得證。
例: [X1]補=0.0110100 則[2X1]補=0|0.1101000=0.1101000,未溢出。
[X2]補=1.0010110 則[2X2]補=1|0.0101100=0.0101100,溢出,因為乘2后符號變反。
3.反碼表示
反碼又稱1的補碼,下面分別給出定點小數和定點整數的反碼定義。
設機器字長為n位,定點小數的反碼定義如下:
[X]反 = X ,0<=X<1
2-2-(n-1)+X ,-1<X<=0 (MOD(2-2-(n-1)))
式中X表示真值,[X]反表示真值X的反碼。
設機器字長為n位,定點整數的反碼定義如下:
[X]反 = X ,0<=X<2n-1
2n-1+X ,-2n-1<X<=0 (MOD(2n-1))
例:設機器字長n=8
[+35]反=(00100011)2
[-35]反=(28-1)+(-35)=(11111111)2-(00100011)2=(11011100)2
[+0.8125]反=(0.1101000)2
[-0.8125]反=(2-2-7)+(-0.8125)=(1.1111111)2-(0.1101000)2=(1.0010111)2
·反碼有如下性質:
1.正數的反碼與原碼相同,負數的反碼為該負數對應的原碼符號位不變,數值位按位取反。因此,在反碼表示中,最高位為符號位,0表示正,1表示負,這一點與原碼相同。
2.反碼中也有兩種0的表示,由定義[+0]反=00...0 ,[-0]反=11...1,這使得反碼與真值不能一一對應。
3.假設機器字長為n,則
·反碼表示的定點小數,范圍為 -(1-2-(n-1))~+(1-2-(n-1))
·反碼表示的定點整數,范圍為 -(2n-1-1)~+(2n-1-1)
4.負數的反碼大于正數的反碼,這一點與原碼類似。
5.反碼與原碼的轉換。
當X>=0時,由定義,真值X=原碼=反碼
符號位不變
當X<0時 [X]原 <---------------------------->[X]反
數值位按位取反
證明: 只證X<0部分
[X]原 = 2n-1-X
[X]反=2n -1 + X = 2n-1 + 2n-1 -1 -(-X)
和X的原碼比較: 符號位不變 按 位 取 反
4.移碼表示
計算機中常用移碼來表示浮點數的階碼,階碼為整數,因此我們只介紹定點整數的移碼表示。若機器字長為n位,則移碼的定義如下:
[X]移=2n-1 + X , -2n-1<=X<2n-1
上式中X為真值,[X]移表示真值X的移碼,2n-1是一個固定的偏移值。
移碼的性質:
1.移碼的符號位。
當-2n-1<=X<0時,0<=[X]移<2n-1,即符號位為0.
當0<=X<2n-1時,2n-1<=[X]移<2n,即符號位為1.
因此,移碼中用0表示負,用1表示正,這點與原碼,補碼,反碼都不同。
2.移碼中0的表示是唯一的。[0]移=000...0
3.移碼的表示范圍為 -2n-1<=X<2n-1
4.[X]移與X呈線性正比關系。
5.移碼與補碼的關系:
假設機器字長為n位,由定點整數移碼與補碼的定義:
[X]移= 2n-1+X , -2n-1<=X<2n-1
[X]補= X , 0<=X<2n-1
2n+X , -2n-1<=X<0
·當X<0時,[X]補=2n-1 + 2n-1+X =[X]移+2n-1,即X<0時,將[X]移的符號改為1即為[X]補,將[X]補的符號改為0即為[X]移。
·當X>=0時,[X]移= 2n-1 + X=2n-1+[X]補,即X<0時,將[X]移的符號改為0即為[X]補,將[X]補的符號改為1即為[X]移。
綜合兩方面,可得出結論,將即X<0時,將[X]移的符號位取反即得[X]補,反之亦然。
符號位取反
[X]移 <-------------------->[X]補
轉載請注明出處http://www.shnenglu.com/RyanWang/archive/2010/02/17/107955.html