上QQ阅读APP看书,第一时间看更新
3.1.4 数值的补码表示法
观察图3.6中的时钟,这是一个分成了12个点的圆。假设时钟指针一步只能走到相邻的整点,那么时钟一共只有12种不同的状态,我们称之为时钟的模。
图3.6 时钟解释补码
现在时钟指针指向了5点,我们要让它回到0点。有两种方法可以实现:一种是直接回退5个小时(5-5),如图3.7所示;另一种是继续往前走7个小时(5+7),如图3.8所示。
图3.7 时钟5-5
图3.8 时钟5+7
在第二种方法中,5+7=12,而12刚好是时钟的模,此时指针指向了0。
为了让指针回到0点,我们只需要让它加上模与当前时间的差即可。因此,指针回退5小时与指针前进7小时是等价的。我们可以用指针前进来代替指针后退。
将这种思想带入三位二进制中,我们知道三位二进制能表示8个不同的数字,因此它的模为8。要让3回到0,我们可以让3减去3,也可以让3加上模与3的差,即8-3=5。因此,在三位二进制中,-3可以用5的二进制表示(即101)。
这种用加法来等效减法的二进制表示法被称为补码表示法。
在补码表示法中,正数的补码就是其二进制本身,而正数对应的负数的补码为模减去正数的二进制。负数的补码为模与正数的差的二进制,如图3.9所示。
补码表示法通过最高位区分正数和负数,并且巧妙地应用了溢出,所得到的计算结果也是正确的。类似于钟表只需要向前走就可以实现减法,计算机的电路设计也只需要设计加法电路,极大地简化了计算机内部电路的复杂程度。
当然,求一个正数对应的负数的补码也有一个更为简单的方法,如图3.10所示。
(1)先写出这个正数的二进制。
(2)从二进制的右边开始,在遇到第一个1之前,全都填0。
(3)遇到第一个1之后,填1。
(4)将遇到1之后的全部取反。
图3.9 负数的补码为模与正数的差的二进制
图3.10 计算补码的简单方法