计算机基础之为什么要有补码运算及反码加1得补码的原理

来源:互联网 发布:2016学生调查数据提交 编辑:程序博客网 时间:2024/05/18 01:19

1.基础知识:

   正数的补码为正数的原码本身,如[5]原 = [5]补 = 二进制 0000 0101

   负数的补码为反码+1, 如[-5]补 = [-5]反 + 1 , 

   举例:[-5]原 = 二进制数 1 000 0101 (最高位为0表示正数,最高位为1表示负数)

          则[-5]反 = 1 111 1010

              [-5]补 = 1 111 1011         ([-5]反 + 1)

   因为计算机中只有加法器没有减法器,因此我们需要将二进制的减法运算转为加法运算。

   举例:

       正常减法运算

           十进制 5-2 = 3

           二进制运算:0000 0101 - 0000 0010 = 0000 0011

       转为加法运算:

           十进制 5 + (-2) = 3

           二进制运算:0000 0101 + 1 000 0010 = 1 000 0011  (-2)

        直接做加法运算后结果为-2, 并不是3.具体原因我们接下来讲:

2. 基础进阶--真正的负数

    在计算机二进制中0000 0001 表示+1, 而1000 0001 表示-1只是我们对正负值的一种约定,我们规定高位为1表示负数,高位为0表示正数,但其实直接拿这种值进行运算是错误的,因为无论二进制运算还是十进制运算,都应満足相反数相加= 0,   

    比如 -1 + 1 = 0,    -2 + 2 = 0,     -3 + 3 = 0 。。。-n + n = 0.

    而 1 000 0001 + 0 000 0001 直接通过二进制相加运算是不等于0的。但我们可以通过补码的方式来实现。请继续往下看

    如果要使得 1 000 0001 + 0000 0001 = 0得到满足,我们首先要分析0000 0000 - -0000 0001 = ?

    我们看到, 0 - 1 在二进制中是没法相减的,因为0<1, 且没法借位。为了实现相减操作,我们可以在最高位前面加个1 ,实现借位操作,此时0就变为1 0000 0000,等于2的8次方256了。而

                        1 0000 0000

                      -    0000 0001

                      =1 1111 1111

      因为计算机中一个字长为8位,所以我们可以忽略借来的最高位1, 得到0000 0000 - 0000 0001 = 1111 1111的结果 ,那我们可以得出结论:

      1111 1111 + 0000 00001 = 0000 0000,也就是说,-1对应的值是1111 1111,   -2对应的值是0000 0000 - 0000 0010 = 1111 1110, -3 就是 1111 1101

3. 所谓补码

      我们通过前面2个知识点已经知道, 

                                                               十进制0对应的二进制实际上是1111 1111 + 0000 0001, 

                                                               十进制-1对应的二进制实际上是1111 1111,  而非1000 0001

                                                               十进制-2对应的二进制实际上是1111 1110,  而非1000 0010

                                                               十进制-3对应的二进制实际上是1111 1101,  而非1000 0011

                                                               十进制-n对应的二进制实际上是(1111 1111 + 0000 0001 ) - [-n]原码 

      我们将通过在最高位前添加1来实现以1111 1111 + 0000 0001代表0的这种表示形式称为补码。本质上就是所有负数都多增加2的8次方来使得相加后溢出,得到余数。

4.为什么补码是反码+1

      通过上面第3条知识点我们已经知道

                                                               0 = 1111 1111 + 0000 0001, (=0000 0000的反码+ 1)

                                                              -1 = 0 - 1 = 1111 1111

                                                              -2 = -1 - 1 = 1111 1111 - 0000 0001 = 1111 1110

                                                              -3 = -1 - 2 = 1111 1111 - 0000 0010 = 1111 1101

                                                              -4 = -1 - 3 = 1111 1111 - 0000 0011 = 1111 1100

                                                              -5 = -1 - 4 = 1111 1111 - 0000 0100 = 1111 1011

       因为0000 0000的反码就是1111 1111, 而0000 0000等于1111 1111 + 0000 0001, (即0的反码加1)

       而-1 = 1111 1111, 且1111 1111与其他任何二进制数的相减运算,如

                                                                                                                   1111 1111 

                                                                                                                 - 0000 0101  (5)

                                                                                                                 = 1111 1010  

       其运算结果都是被减数的反码, [5]原= 0000 0101,   [5]反 = 1111 1010

       因为我们在上面 -5 = -1 - 4 = 1111 1111 - 0000 0100 = 1111 1011 的式子中是用-1减-4得到的-5,所以如果用1111 1111(-1) 减 0000 0101(5) 所得的结果还要再加1才能得到正确的值,即1111 1010 + 1 = 1111 1011, 因为0-5才等于-5, 而0是-1+1(1111 1111 + 0000 0001).

原创粉丝点击