为什么带上符号位计算,仍然可以算出正负数对应的补码

请添加图片描述

🚀前言

为应付期末,速成数电,看到原反补码,不知道为啥计算结果仍然为补码,查了半天决定记录。

🚀 为什么要引入原反补码

因为对于数的加减运算,加法很容易但是减法很麻烦(硬件上实现),所以大佬们利用加法表示减法。下面我们来看具体如何操作:

✈️ 利用加法表示减法

我们用一个🌰来解释:

用两个 仅一位十进制数 演示:7-3=7+(-3)
实际上,7+(-3) 等于 7+(10 - 3) = 14。虽然 7+(10-3) 的结果为 14,但由于只有一位,所以高位 1 舍去,结果为 4,与 7-3=4 一致。
将这个结论推广到更多位或其他进制依然适用,比如用三位表示 155-123=155+(-123)=32,同样的 155+(1000-123)=1032,高位去掉结果仍然正确。
在计算机中就是这么算的,上面的过程相当于模拟了计算机计算的过程,只不过计算机使用二进制计算,舍去高位叫 溢出

✈️ 关于数字在计算机中的存储

上面利用 加法表示减法 的过程中用到了 减法,我们引入原反补码来解决这个问题。

在计算机中,我们利用二进制进行数字存储和计算。比如上述的例子 7-3=7+(-3)=7+(10-3) 中,我们眼中的 7-3,而在计算机眼中没有减法只有加法,所以计算机看到的是 7+(-3)
如何区分正负数?规则:正数最高位为0,负数最高位为1。
以有符号 int 类型为例,正数的最高位为0,负数的最高位为1。

为了避免减法,引入了反码和补码:

  • 反码:符号位不变,其他位按位取反。
  • 补码:反码加1。

🚀 数学解释

补码运算的数学基础可以用以下公式来解释:

  1. 对于正数 ( a ) (a) (a)

    • 补码:直接等于原码。
  2. 对于负数 ( − b ) (-b) (b)

    • 补码:等于 ( 2 n − b ) (2^n - b) (2nb)

在补码运算中,加法和减法通过以下方式处理:

a + ( − b ) = a + ( 2 n − b ) = ( a − b + 2 n ) m o d    2 n a + (-b) = a + (2^n - b) = (a - b + 2^n) \mod 2^n a+(b)=a+(2nb)=(ab+2n)mod2n

由于超出 (n) 位的部分被丢弃,最终结果在正确范围内。

🚀 为什么带上符号位计算,仍然可以算出正负数对应的补码

上面铺垫了这么多就是为了介绍这个终极问题,下面为大家解惑:

实际上,有了上面的基础,很好理解为什么符号位参与计算仍对。分为三种情况:正数与正数,负数与负数,负数与正数。但正数与正数和负数与负数不能发生溢出,这种溢出不被允许,所以只考虑正数与负数。
正数绝对值更大时,会进位到符号位,符号位再次进位溢出,然后符号位为0,结果为正数;负数绝对值更大时,不会发生溢出,符号位最后为1,结果为负数。

举例:

表示数值位有三位: a + (-b)
a = 101
b = 011
补码(-b) = 1000 - 0011 = 101
a + (-b) = a + 补码(-b) = 101 + 101 = 1010,a > b溢出到符号位,符号位进位然后结果为正
a = 011
b = 101
补码(-b) = 1000 - 0105 = 011
a + (-b) = a + 补码(-b) = 011 + 011= 110,a < b 没有溢出,符号位为1结果为负


如果帮到你,请帮我点个赞吧!

请添加图片描述

  • 63
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 34
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿辉不一般

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值