1. 程式人生 > 其它 >補碼和求補的區別以及計算機對減法的處理

補碼和求補的區別以及計算機對減法的處理

1、  補碼和求補運算

補碼:對於一個帶符號的數來說,正數三碼合一(原碼、反碼、補碼都一樣);負數的反碼為其原碼除符號位以外的各位按位取反,負數的補碼是先取反然後加一,不要忘了負數的符號位為1。

求補運算與補碼的區別在於,求補運算時不考慮是否有符號位,所有的位都要取反,最後加一,它求得的結果不是求這個數的補碼,而是這個數相反數的補碼。

 以0-0xFF之間數的減法為例:

   X-Y=X+(-Y)=X+(0x100-Y)-0x100

   Y+Y(反)=0xFF

   Y+Y(反)+1=0x100

由以上三個式子可以推匯出,neg(Y)=0x100-Y=Y(反)+1,即X-Y=X+NEG(Y)。

注:1)這裡我們要區分一個反數和反碼的區別,我們以二進位制來講:反數實際就是對原碼的每一位進行包括符號位在內進行取反,即0變1,1變0,對反數的理解可以參考

http://www.cnblogs.com/wxl2578/articles/3239669.html

  2)neg是求補運算,求補運算是反數加1,這也就是我們上面說的求補運算時不考慮正負,對符號位也要求反,一個數的求補就是0減去這個數,上述0x100在我們討論的0-0xFF之間的數來說就是0。

  3)負數的求補和補碼可以這樣記:轉換成二進位制後,求補是從右向左找到第一位為1,包括這位1在內的右邊所有位數保持不變,左邊的全部取反;負數補碼是在求補的基礎上除了保證那位1和他右邊的所有位不變外,還要保證符號位也不變。

實際上處理減法我們可以採用兩種方式一種是補碼相加,一種就是求補的方式。例如:

 12-8

12的三碼合一都為 0000,1100

-8的原碼:1000,1000

                              反碼:1111,0111

                             補碼:1111,1000

首先以補碼相加的形式:

      12       0000,1100     

    -  8     +1111,1000

——————————————

        4      10000,0100

最高位越界丟棄。另一種方式是求補X-Y=X+NEG(Y),NEG(8)=1111,1000

      

        12       0000,1100     

    -  8     +  1111,1000

——————————————

         4      10000,0100

其實這兩種方式都是一樣的,因為NEG(X) = -X的補碼。