补码:

正数的补码是本身

负数补码是按位取反后加一

通过补码做加法,能实现减法的效果。

原因

其实这是一种“模的范围内等价,我们可以直接做等价转换的运算来推导:

例子:

5: 0101
3: 0011
-3:1101

5 - 3 = 5 + (-3)

0101 - 0011 = 0010
0101 + 1101 = 0010      【其实这里溢出了,计算结果本应为 10010】

证明正确性:

一个二进制数与反码相加后为全10011 + 1100 = 1111

可得 0011 + 1100 + 1 = 100000

因此 -0011 = 1101 - 100000

所以

5 - 3
= 5 + (-3)
= 0101 + (-0011)
= 0101 + 1101 - 100000  【 * 】
= 10010 - 10000
= 0010

我们注意看标 * 的那一步,其实就是补码运算再加个减法。

因此,不考虑最高位的溢出,模意义下的计算结果是相同的。或者说,我们默认做了一个减法,因为结果显而易见,所以不明写了。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐