补码和求补的区别以及计算机对减法的处理
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的补码。
注:以上为本人理解,如有错误欢迎大家指正,不胜感谢。