zoukankan      html  css  js  c++  java
  • 补码和求补的区别以及计算机对减法的处理

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

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

  • 相关阅读:
    Leetcode Best Time to Buy and Sell Stock II
    Leetcode Shortest Word Distance III
    Leetcode Shortest Word Distance II
    Leetcode Shortest Word Distance
    牛客多校第四场 J Free 最短路
    牛客多校第四场 A meeting 树的半径
    hdu多校第二场1008(hdu6598) Harmonious Army 最小割
    hdu多校第二场1011 (hdu6601) Keen On Everything But Triangle 主席树
    hdu多校第二场 1010 (hdu6600)Just Skip This Problem
    hdu多校第二场 1005 (hdu6595) Everything Is Generated In Equal Probability
  • 原文地址:https://www.cnblogs.com/wxl2578/p/3239671.html
Copyright © 2011-2022 走看看