【C语言】补码


一、补码是什么?

补码的发明是为了解决负数用二进制怎么表示的问题。范围再大一点是为了解决有符号数用二进制怎么表示的问题。

二、使用规则

以8位二进制为例。

规则1:第7位为符号位,0表示正数,1表示负数。

如+3可以表示为 0000 0011,
那-3是不是可以用1000 0011表示呢?

不行!这样做最大的问题在于(+3)+(-3)!=0了。
即 0000 0011+ 1000 0011 != 0。

怎么解决呢?

规则2:正数的补码是其本身的二进制形式;负数的补码需要先将其绝对值按位取反,再 +1。

这下,
+3的补码还是0000 0011。

-3的补码则经过了如下变化
首先-3的绝对值是3,所以其绝对值表示为1000 0011(符号位不变)
然后按位取反,表示为1111 1100(符号位不变)
最后+1,得到1111 1101

这时候0000 0011 + 1111 1101=1000 0000
怎么还是不等于0?
左边的1溢出了,在一个字节单元中,结果就是0.

参考资料

1、https://fishc.com.cn/forum.php?mod=viewthread&tid=67124&extra=page%3D1%26filter%3Dtypeid%26typeid%3D571

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值