原码、补码和用补码表示时的溢出

虽然原码能一一映射的表示-127~127这255个数但是在计算的时候硬件实现起来比较复杂,而且会出现两个0的表示,所以不是合理。

补码的出现他可以实现一一映射的表示-128~127这256个数,在计算时将减法变为加法进而实现了符号位也可以进行计算。补码是将负数看成一种后移,比如4-1那么就是说将4后移一个数得到的值就是计算的结果,那么我可以从4走到255在回到3就可以实现同样的结果(以8位表示数值为例),相当于加上255(总共256个数),相当于循环了一圈差一个,此时有进位我们不管即可,此时俩个8位加起来得到的值00000100+11111111=00000011(有进位),其中00000011是我们要的最终结果而进位是不要的。所以就实现了将减法变为加法进而符号位参与了计算,其实加负数相当于沿数轴的正方向走到255后再从0开始沿数轴正方向走完剩余的步数。用8位二进制来表示-128~127,就是用0~255来表示-128~127,形成一一映射关系,用补码表示时的映射关系如下图:

那么相加时什么时候会溢出呢,那么溢出只能出现在正正相加和负负相加,由于-128~127正数与负数幅值范围相当,正负相加最大(即正方向)为127(正数最大值)+(-1)(负数最大值)=最大值,而最小(即负方向)为-128(负数最小值)+(0)(正数最小值)=最小值,那么此时相加得到的最终值就是计算结果(不管是否有进位),即xxxxxxxx+yyyyyyyy=aaaaaaaa,那么aaaaaaaa即为计算结果,不管是否有进位。当正正相加的情况下,那么只能出现正方向溢出即超出127即大于等于128(10000000),那么就是0xxxxxxx+0yyyyyyy=aaaaaaaa,当aaaaaaaa的第一位为1时那么就说明溢出了,即第六位进位而第七位不进位;当负负相加时,即1xxxxxxx+1yyyyyyy=aaaaaaaa,不管最高位有没有进位,aaaaaaaa的值不能小于等于127,即1xxxxxxx沿数轴正方向走到255后从0开始再走时必须走到128以后,不能再128之前,不然就是溢出了,所以当aaaaaaaa小于01111111(127)时就认定为出现溢出,即结合1xxxxxxx和1yyyyyyy最高位均为1,相加肯定会进位,进位后如第六位有进位则最高位为1,也就是说第六位没有进位而第七位有进位时则出现负方向溢出。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值