文章目录
- 🚀前言
- 🚀 为什么要引入原反补码
- ✈️ 利用加法表示减法
- ✈️ 关于数字在计算机中的存储
- 🚀 数学解释
- 🚀 为什么带上符号位计算,仍然可以算出正负数对应的补码
🚀前言
为应付期末,速成数电,看到原反补码,不知道为啥计算结果仍然为补码,查了半天决定记录。
🚀 为什么要引入原反补码
因为对于数的加减运算,加法很容易但是减法很麻烦(硬件上实现),所以大佬们利用加法表示减法。下面我们来看具体如何操作:
✈️ 利用加法表示减法
我们用一个🌰来解释:
用两个
仅一位
的十进制数
演示: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。
🚀 数学解释
补码运算的数学基础可以用以下公式来解释:
-
对于正数 ( a ) (a) (a):
- 补码:直接等于原码。
-
对于负数 ( − b ) (-b) (−b):
- 补码:等于 ( 2 n − b ) (2^n - b) (2n−b)。
在补码运算中,加法和减法通过以下方式处理:
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+(2n−b)=(a−b+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结果为负
如果帮到你,请帮我点个赞吧!