上一節進制數中雞啄米講了二進制、八進制、十進制和十六進制數的表示方法和相互轉換關系。這節主要講解二進制的幾種編碼表示方法。

        計算機存儲數據信息都是以二進制編碼存儲的,機器內存儲的數據的表達形式稱為“機器數”,而它代表的數制稱為這個機器數的“真值”。數有正負之分,那么在計算機里怎么表示正負呢,0和1不就剛好嗎?呵呵,沒錯,就是用“0”表示正號,“1”表示負號,符號位放在數的最高位。例如,二進制數X=(+1010100),Y=(-1010100),則他們在機器中就存為

         X:

0 1 0 1 0 1 0 0

         Y:

1 1 0 1 0 1 0 0


        最左邊那一位是符號位,跟它后面的數字一起組成一個數。

 雞啄米:C++編程入門系列之二(原碼、反碼與補碼)

        為了讓計算機計算起來更簡單,硬件設計起來也比較簡單,人們研究了多種二進制編碼方法。其實就是對負數的不同編碼,正數基本不變。

1.原碼

        剛才雞啄米講到的最高位是符號位,后面是絕對值來表示一個數,這種編碼叫做“原碼”。但是有個問題,就是0的表示不唯一,+0就是000...0,-0就是1000...0。另外,進行四則運算時,對于符號位都要單獨處理,同號怎樣運算,異號又怎樣運算,有時還需要借位,這對計算機來說是很麻煩的,所以必須找更好的編碼方法。

2.反碼

        其實反碼不怎么用,但是怎么說是一種編碼方式,而且是求補碼的中間碼,我們還是需要學一下的。

        正數的反碼跟原碼一樣,負數的反碼的符號位跟原碼一樣,但其余各位取反,也就是0變1,1變0。例如,二進制數+1100111的原碼是01100111,反碼也是01100111,-1100111的原碼是11100111,反碼則是10011000。

3.補碼

        大家想下,如果現在是7點,但是雞啄米的表時間是9點,那怎樣才能把它調準呢?雞啄米可以往前調2個小時,也可以往后調10個小時,結果都是7點。這里就涉及到取模運算(以前我們叫求余運算),9-2 = 7,(9+10)%12 = 7,這里的%就是C++里的取模運算符。2與10對模數12是互為補數的。補碼就是利用的這個原理,利用補碼可以把減法運算變成兩個補碼相加,具體就是將其變為一個正數和一個負數的加法運算,然后計算這個正數和負數的補碼,兩個補碼相加。因為補碼的符號位作為數值參與運算,所以就不存在符號位單獨處理的問題。

        正數的原碼、反碼和補碼是一模一樣的。

        負數的補碼是其反碼的最末位加1得到的,我們經常順口記為負數的補碼就是取反加1。

        必須要指出的是補碼運算的結果也是補碼,還要把它算到原碼才得到最后結果。那么知道補碼怎么計算原碼,很簡單,就是對補碼再求補碼就是源碼了。

        雞啄米給大家個例子:

       10-67 = ?,10的原碼是00001010,補碼跟原碼一樣,-67的原碼是11000011,補碼是10111101。兩個補碼相加是11000111,這是結果的補碼,求原碼要對這個補碼再求補碼,取反加1后就是10111001。

        最后雞啄米再跟大家說下浮點數的存儲方式。浮點數可以理解為小數。浮點數N的科學表示法為:N=M×2E。E表示2的冪,叫做N的階碼,它的位數反應了此浮點數的范圍。M表示N的全部有效數字,叫做N的尾數,它的位數反應了浮點數的精度。

        浮點數的存儲格式隨著機器的不同而不同,比如,如果機器是16位機,其二進制浮點數的組成為4位階碼,12位尾數,存儲格式如下:

    15       14  12     11     10    0

階碼符號 階碼 尾數符號 尾數 

 

        這節的內容也是比較基礎的內容,但是當你學會編程后可能用的很少,到了一定程度才會用到,雞啄米希望到那時你再回來溫習溫習啊。

除非特別注明,雞啄米文章均為原創
轉載請標明本文地址:http://www.028keji.com/software/23.html
2011年8月29日
作者:雞啄米 分類:軟件開發 瀏覽: 評論:10