Skip to content

二进制负数表达

从 OI 开始,“背过”一个解法 —— 补码 = 原码的反码 + 1,也就是把原码按位反转之后加1就好。但是具体为什么要定义这样的一个算法,一直没有认真考虑。

理解

首先在进行减法操作的时候,实际上还是做加法操作。根据著名的

1+(1)=0

我们可以得知,一个数加上它的相反数应该为零。

那么假设我们已经知道了一个数x的二进制表达为其原码。那么显然的,把它的每一个二进制位取反之后(得到反码)与原数(原码)相加之后会得到一个1111 1111类似这样的数字(按照字节容器的字节数补齐,所以得到连续1的个数应当与容器字节数相等)

此时,如果再把上述结果加1,就会得到1 0000 0000的结果,然而最高位的1恰好超出了容器的字节数而被舍去,即剩下的结果便为0000 0000,正是在当前情况下0的表达。

Released under the MIT License.