计算机负整数的二进制表示


在中学的信息技术课上,相信大家也听说过电脑中原码、反码、补码这些名词,这篇小文章就是来用数学公式来解释为什么负数的二进制表示是补码。如果你不知道补码是什么,请点击这里查看百科解释

假设计算机内部用 \(k\) 位二进制来表示一个整数。那么,一个正整数 \(I\) 就可以写成下面的形式:$$ I = \sum_{i=1}^{k} d_i \times 2^{i-1} $$
其中 \(d_i\) 表示二进制数从右往左数的第 \(i\) 位数字。

而根据 Two’s Complement 原则,一个正整数 \(I\) 的负数就应该这样表示:$$ Neg(I) = 2^k – I $$

从这个公式出发,怎样推出补码就是我们想要的结果呢?我们知道,补码就是每一位取反,然后加一。而对每一位取反,就相当于用 1 减去二进制上的每一位数,所以,我们得到了关于负数的另外一个公式:$$ Neg(I) = \sum_{i=1}^{k} (1-d_i) \times 2^{i-1} +1$$

将求和符号拆开,然后展开,我们得到 $$ Neg(I) = \sum_{i=1}^{k} 2^{i-1} – \sum_{i=1}^{k} d_i \times 2^{i-1} + 1$$

注意到公式左边是等比数列求和,所以 $$ Neg(I) = \frac{2^0(2^k-1)}{2-1} – \sum_{i=1}^{k} d_i \times 2^{i-1} + 1 $$ $$= 2^k- \sum_{i=1}^{k} d_i \times 2^{i-1} $$

到这里,结果就很显然了,减号的右边就是 \(I\),所以 $$ Neg(I) = 2^k – I $$

可以看出来,补码的运算结果和 Two’s complement 公式相同,所以我们可以下一个结论,补码的运算可以得到一个正整数的负数!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注