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