快速求负数的补码的原理

不久之前,因为做项目遇到了不少客户的数据为负数的,由于数据传输的关系,需要将负数的值传给客户,因此,接触到了一种非常不错的计算负数补码的方法,下面想总结一下这个方法的原理,方便自己记忆。

话不多说,先上结论:

负数的补码 = (负数+ 2的数据数量次方)取二进制

例子:一个字节数数据(8bit),-2
-2的补码 = -2 + 2^8 = 11111110

通用计算方法

众所周知,补码与原码,反码的关系如下:

1、正数的原码 = 正数的反码 = 正数的补码
2、负数的原码 = 对应正数的原码 + 2的数据位数量次方,最高位作为符号位
3、负数的反码 = 负数的原码的符号位不变,其他数据取反
4、负数的补码 = 负数的反码+1

计算原理

把有符号位的负数,当作无符号数来表示,就可以知道,对于取反操作来说,负数的原码取反 = 2的数据位数量次方 - 负数原码 - 1

以一个字节为例:
-1的反码 = 1取反 = 2^8 - 1 - 1 = 1111 1110
-2的反码 = 2取反 = 2^8 - 2 - 1 = 1111 1101
-3的反码 = 3取反 = 2^8 - 3 - 1 = 1111 1100
(以此类推)
-128的反码 = 128取反 = 2^ 8 - 128 -1 = 1000 0000

其实通过上面的罗列就可以清楚的知道为什么了,因为对于2进制来说,负数实际上就是对应正数的原码+2的数据位数量次方作为符号位,同时由于正数的补码,原码,反码当作无符号位时,计算方式和负数是一致的,其差值恰好为2的数据位数量次方。

如果是一个字节,就是2的8次方
如果是两个字节,就是2的16次方
如果是三个字节,就是2的24次方
如果是四个字节,就是2的32次方

由此可见,熟悉了有符号数和无符号数的关系之后,就不需要再通过取反+1这种操作来计算负数以及负数的补码了,只需要通过普通的计算即可

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值