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的補碼。
注:以上為本人理解,如有錯誤歡迎大家指正,不勝感謝。