补码和求补的区别以及计算机对减法的处理

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的补码。

 

注:以上为本人理解,如有错误欢迎大家指正,不胜感谢。

posted @ 2013-08-06 00:15  熟如陌路  阅读(6824)  评论(0编辑  收藏  举报