本文將介紹計算機中四種編碼: 原碼,補碼,反碼,移碼的有關知識。   


   計算機需要處理的信息包括數值信息以及各種符號,文字,圖像語言等信息。但計算機內部的硬件只能表示兩個狀態0和1,計算機只能對二進制的數字信息進行傳送、處理。加工和存儲,因此,在計算機的內部,各種信息都必須經過數字化編碼后才能被傳送加工和處理,必須對這些信息進行編碼。
   各種數值數據在計算機中的表示的形式成為機器數,其特點是采用二進制計數制,數的符號用0、1表示,小數點則隱含表示而不占位置。機器數對應的實際數值稱為數的真值。小數點位置固定的數稱為定點數,有無符號數和帶符號數之分。計算機中的定點數只采用純整數或者純小數形式。
   無符號數表示正數,在機器數中沒有符號位。對于無符號數,若約定小數點的位置在機器數的最低位后,則是純整數;若約定小數點的位置在機器數的最高位之前,則是純小數。
   對于帶符號數,n位機器數的最高位Xs是表示正負的符號位,其余n-1位則表示數值。若約定小數點的位置在機器數的最低數值位之后,則是純整數,若約定小數點的位置在機器數的最高位之前(符號位之后),則是純小數。
  
           帶符號定點整數格式: Xs  Xn-2 - - - X1 X0 .
           
           帶符號頂點小數格式: Xs. Xn-2 - - - X1 X
             
           ("."為小數點位置)

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<2
n-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<2
n-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]-2=(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]= 2+  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<2
n-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