补码的前世今生

常会认为补码是有符号数, 说起来, 补码这个词说的也是原数字和二进制码字之间的关系

符号数认识补码(无符号数也可以认识为有符号数)

数字-补码-原码表 这是关于编码表示数字的问题
+8 0111 8
7 0110
6
5
4
3
2
1
0 0000

-1 1111 15
-2 1110 14
-3
-4

-8 1000 8

不如按照 原码值排列, 就像[[时钟]]一样 全都是时钟计算, 想模就想[时钟]吧!

这是把-8-7的运算域映射到原码0-15的运算域:
在十进制里 2 - 3 = -1 <==> (2 + 5) % 16 - 8
这里x%16-8我愿称之为平移模, 上面右侧%16的运算是由码字的运算位溢出完成的. 可以看作在原码下0010 + 0101 = 0111
再溢出取模(此处无) -8的平移运算是人为指定的, 通过把最高位理解成符号位再映射到-8-7(也是16个数字)

8 - 1 = (8 + 15) % 16 = 7
不对, 重新映射还不是减一个数, 大概是正数就不动, 然后…?
把上文地-8(y = x - 8 => f = f(x))替换成一个新的重新映射地函数吧, 这里不想了, 关键思想已经捋清了, 不管了, 可能是过界地和没过界的if-else函数.

In sum, 补码运算把减法运算做加法运算表示(简化电路设计), 实际上是数字游戏, 把数字先映射到原码运算, 再切换回补码的人为认识, 让符号位也正确地参与运算.

最后, 为什么是有符号数? 看一道无符号数的例题: unsigned int a = 137 - 256 其实也是先做补码运算, 然后将补码理解成无符号数的补码(码字不变, 变得是 二进制数转化为10进制数的方式, [最高位是否被认为是符号位]可以得到不同的十进制数结果)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值