2的补码

此文是基于阮一峰大神的文章-关于2的补码的学习总结,便于加深印象和回顾,若想看原文,请走刚才的传送门~

负数在计算机中如何表示呢?

在计算机内部采用2的补码(Two’s Complement)表示负数。

什么是2的补码?

它是一种数值的转换方法,要分二步完成:

  • 第一步,每一个二进制位都取反值,0变成11变成0。比如:00001000取反为11110111
  • 第二步,将上一步的得到的值+1。即:

    11110111 + 1 = 11111000;

所以,1111100000001000的补码,也就是说-8在计算机中用11111000表示;

为什么要用补码来表示负数呢?

对于计算机,加减乘除是最基本的运算,要尽量设计的很简单;

  • 运算法则减去一个数等于是加上这个数的负数;
  • 计算机的基础电路只有加法,使得设计更加简单;

由于对于二进制的编码有三种方式:原码反码补码

  • 使用原码进行正数 + 负数的类减法所得的结果并不正确;
  • 使用反码进行计算时,结果的真值部分是正确的,但是会有一个特殊的值:0。由于0是具有符号位是没有任何意义的,并且会有1000 00000000 0000两个编码表示0;
  • 使用补码进行计算可以完美解决真值、符号位和0的问题,同时由于(-1) - (-127) = -128,补码会以1000 0000表示 -128,即还能够表示一个最低数。
  • 原码和反码表示的范围为[ -127, 127 ],而补码可以表示[ -128, 127 ]

2的补码的本质:

负数可以换成是 0 - 正数 得到的,因此 对于 -8 可以看做是 0 - (+8) 得到的;
那么对于二进制的来说即如下形式:

           0 0 0 0 0 0 0 0
        -  0 0 0 0 1 0 0 0
    -------------------------- 
           1 1 1 1 1 0 0 0

因为 被减数 0000 0000 小于减数 0000 1000,因此需要向上一位借1,因此实质上被减数是1 0000 0000

          1 0 0 0 0 0 0 0 0
       -    0 0 0 0 1 0 0 0
    -------------------------- 
            1 1 1 1 1 0 0 0

进一步观察可以发现,1 0000 0000 是由 1111 1111 + 0000 0001 所得,因此:

            1 1 1 1 1 1 1 1
       -    0 0 0 0 1 0 0 0
    -------------------------- 
            1 1 1 1 0 1 1 1
       +    0 0 0 0 0 0 0 1
    --------------------------            
            1 1 1 1 1 0 0 0

2的补码的转换步骤就是这么来的;

为什么正数加法适用于2的补码?

事实上,我们要证明的是X - YX + (-Y)可以用X + Y的2的补码完成;
根据上面的所说的,Y的2的补码可以用1111 1111 - Y + 1来表示;
即:X + (-Y) => X + ( 1111 1111 - Y + 1 ) = Z

基于以上算式,分为 两种 情况讨论:

  • 第一种,X < Y,Z 应该为负数,那么对 Z 采用2的补码的逆运算求出正数值然后在加一个负号即可得到
    Z = -[ 1111 1111 - ( Z - 1 ) ] 
    Z = -[ 1111 1111 - ( X + ( 1111 1111 - Y + 1 ) )  + 1 ] = X - Y;
  • 第二种,X > Y,那么 Z 肯定大于 1111 1111,但是我们假定这是8位机,最高位第9位溢出被舍弃,相当于减去1 0000 0000,因此:
    Z = Z - 1 0000 0000 = X + ( 1111 1111 - Y + 1 ) - 1 0000 0000 = X - Y

另外,还有一种方法证明:

Z = X - Y = X + 1111 1111 - Y + 1 = X - Y + 1 0000 0000,

由于是8位机,是不可能出现第9位的(被舍去),即

Z = X - Y + 0000 0000 = X - Y;
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值