keep moving!

          We must not cease from exploration. And the end of all our exploring will be to arrive where we began and to know the place for the first time.
          隨筆 - 37, 文章 - 2, 評論 - 3, 引用 - 0
          數據加載中……

          [轉]原碼、反碼、補碼

          原碼、反碼、補碼

               數值在計算機中表示形式為機器數,計算機只能識別01,使用的是二進制,而在日常生活中人們使用的是十進制,"正如亞里士多德早就指出的那樣,今天十進制的廣泛采用,只不過我們絕大多數人生來具有10個手指頭這個解剖學事實的結果.盡管在歷史上手指計數(5,10進制)的實踐要比二或三進制計數出現的晚."(摘自<<數學發展史>>有空大家可以看看哦~,很有意思的).為了能方便的與二進制轉換,就使用了十六進制(2 4)和八進制(23).下面進入正題.

          數值有正負之分,計算機就用一個數的最高位存放符號(0為正,1為負).這就是機器數的原碼了.假設機器能處理的位數為8.即字長為1byte,原碼能表示數值的范圍為

          (-127~-0 +0~127)256.

           有了數值的表示方法就可以對數進行算術運算.但是很快就發現用帶符號位的原碼進行乘除運算時結果正確,而在加減運算的時候就出現了問題,如下: 假設字長為8bits

          ( 1 ) 10- ( 1 )10 = ( 1 )10 + ( -1 )10 =  ( 0 )10

          (00000001) + (10000001) = (10000010) = ( -2 ) 顯然不正確.

           因為在兩個整數的加法運算中是沒有問題的,于是就發現問題出現在帶符號位的負數身上,對除符號位外的其余各位逐位取反就產生了反碼.反碼的取值空間和原碼相同且一一對應. 下面是反碼的減法運算:

           ( 1 )10 - ( 1 ) 10= ( 1 ) 10+ ( -1 ) 10=  ( 0 )10

           (00000001) + (11111110) = (11111111) = ( -0 ) 有問題.

          ( 1 )10 - ( 2)10 = ( 1 )10 + ( -2 )10 =  ( -1 )10

          (00000001) + (11111101) = (11111110) = ( -1 ) 正確

          問題出現在(+0)(-0),在人們的計算概念中零是沒有正負之分的.(印度人首先將零作為標記并放入運算之中,包含有零號的印度數學和十進制計數對人類文明的貢獻極大).

          于是就引入了補碼概念. 負數的補碼就是對反碼加一,而正數不變,正數的原碼反碼補碼是一樣的.在補碼中用(-128)代替了(-0),所以補碼的表示范圍為:

          (-128~0~127)256.

          注意:(-128)沒有相對應的原碼和反碼, (-128) = (10000000) 補碼的加減運算如下:

          ( 1 ) 10- ( 1 ) 10= ( 1 )10 + ( -1 )10 =  ( 0 )10

          (00000001) + (11111111) = (00000000) = ( 0 ) 正確

          ( 1 ) 10- ( 2) 10= ( 1 )10 + ( -2 )10 =  ( -1 )10

          (00000001) + (11111110) = (11111111) = ( -1 ) 正確

             所以補碼的設計目的是:

               ⑴使符號位能與有效值部分一起參加運算,從而簡化運算規則.

          ⑵使減法運算轉換為加法運算,進一步簡化計算機中運算器的線路設計

           所有這些轉換都是在計算機的最底層進行的,而在我們使用的匯編、C等其他高級語言中使用的都是原碼。看了上面這些大家應該對原碼、反碼、補碼有了新的認識了吧!

          有網友對此做了進一步的總結:

          本人大致總結一下:

          1、在計算機系統中,數值一律用補碼來表示(存儲)。

          主要原因:使用補碼,可以將符號位和其它位統一處理;同時,減法也可按加法來處理。另外,兩個用補碼表示的數相加時,如果最高位(符號位)有進位,則進位被舍棄。

          2、補碼與原碼的轉換過程幾乎是相同的。

          數值的補碼表示也分兩種情況:
          (1)正數的補碼:與原碼相同。
          例如,+9的補碼是00001001。
          (2)負數的補碼:符號位為1,其余位為該數絕對值的原碼按位取反;然后整個數加1。
          例如,-7的補碼:因為是負數,則符號位為“1”,整個為10000111;其余7位為-7的絕對值+7的原碼0000111按位取反為1111000;再加1,所以-7的補碼是11111001


          已知一個數的補碼,求原碼的操作分兩種情況:
          (1)如果補碼的符號位為“0”,表示是一個正數,所以補碼就是該數的原碼。
          (2)如果補碼的符號位為“1”,表示是一個負數,求原碼的操作可以是:符號位為1,其余各位取反,然后再整個數加1。
          例如,已知一個補碼為11111001,則原碼是10000111(-7):因為符號位為“1”,表示是一個負數,所以該位不變,仍為“1”;其余7位1111001取反后為0000110;再加1,所以是10000111

          在“閑扯原碼、反碼、補碼”文件中,沒有提到一個很重要的概念“”。我在這里稍微介紹一下“模”的概念:

          ”是指一個計量系統的計數范圍。如時鐘等。計算機也可以看成一個計量機器,它也有一個計量范圍,即都存在一個“模”。例如:

            時鐘的計量范圍是0~11,模=12。
            表示n位的計算機計量范圍是0~2(n)-1,模=2(n)。【注:n表示指數】


            “模”實質上是計量器產生“溢出”的量,它的值在計量器上表示不出來,計量器上只能表示出模的余數。任何有模的計量器,均可化減法為加法運算。

          例如: 假設當前時針指向10點,而準確時間是6點,調整時間可有以下兩種撥法:

             一種是倒撥4小時,即:10-4=6

             另一種是順撥8小時:10+8=12+6=6

          在以12模的系統中,加8和減4效果是一樣的,因此凡是減4運算,都可以用加8來代替。

          對“模”而言,8和4互為補數。實際上以12模的系統中,11和1,10和2,9和3,7和5,6和6都有這個特性。共同的特點是兩者相加等于模。

          對于計算機,其概念和方法完全一樣。n位計算機,設n=8, 所能表示的最大數是11111111,若再加1稱為100000000(9位),但因只有8位,最高位1自然丟失。又回了00000000,所以8位二進制系統的模為2(8)。 在這樣的系統中減法問題也可以化成加法問題,只需把減數用相應的補數表示就可以了。

          把補數用到計算機對數的處理上,就是補碼

           

          posted on 2008-09-07 02:16 大石頭 閱讀(506) 評論(0)  編輯  收藏 所屬分類: 基礎

          主站蜘蛛池模板: 尉犁县| 都江堰市| 莱芜市| 秦安县| 来安县| 平利县| 沂水县| 田阳县| 连平县| 改则县| 中卫市| 河曲县| 柳河县| 临桂县| 渝中区| 威信县| 宣汉县| 临澧县| 陆川县| 法库县| 清苑县| 昌宁县| 新沂市| 托克逊县| 安化县| 环江| 翁源县| 盖州市| 张家界市| 喀喇沁旗| 若尔盖县| 沅陵县| 昭通市| 多伦县| 绍兴县| 柘城县| 贺州市| 山丹县| 墨竹工卡县| 河间市| 神池县|