本文將介紹計(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 X
             
           ("."為小數(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<2
n-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<2
n-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ǔ)-2=(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ǔ)= 2+  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<2
n-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