![你好,C语言](https://wfqqreader-1252317822.image.myqcloud.com/cover/775/52842775/b_52842775.jpg)
上QQ阅读APP看书,第一时间看更新
3.1.4 数值的补码表示法
观察图3.6中的时钟,这是一个分成了12个点的圆。假设时钟指针一步只能走到相邻的整点,那么时钟一共只有12种不同的状态,我们称之为时钟的模。
![](https://epubservercos.yuewen.com/15A18E/31398146107521006/epubprivate/OEBPS/Images/Figure-P44_5998.jpg?sign=1739115108-1UgSXwbOHhSAz6nMCd8PJwWFAT0Pib3W-0-79400612e677e6fbc8cf64cbc6ed33b0)
图3.6 时钟解释补码
现在时钟指针指向了5点,我们要让它回到0点。有两种方法可以实现:一种是直接回退5个小时(5-5),如图3.7所示;另一种是继续往前走7个小时(5+7),如图3.8所示。
![](https://epubservercos.yuewen.com/15A18E/31398146107521006/epubprivate/OEBPS/Images/Figure-P45_6007.jpg?sign=1739115108-jFiGit4yomY8HVMGqmFV2wkQbdSMy3aU-0-e82139456282d8fe1446df6446d6608d)
图3.7 时钟5-5
![](https://epubservercos.yuewen.com/15A18E/31398146107521006/epubprivate/OEBPS/Images/Figure-P45_6008.jpg?sign=1739115108-siBQB4wwQ5qfrV5ttr6uPrFfS5AUbbh8-0-696a022b0b19eb18a92cba2d2a39d55d)
图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之后的全部取反。
![](https://epubservercos.yuewen.com/15A18E/31398146107521006/epubprivate/OEBPS/Images/Figure-P45_6009.jpg?sign=1739115108-jOq2tVH17YP89bFnXgyqqA0Qv8L4r2k8-0-1867bad217e67e639bf89aee5246c3d0)
图3.9 负数的补码为模与正数的差的二进制
![](https://epubservercos.yuewen.com/15A18E/31398146107521006/epubprivate/OEBPS/Images/Figure-P45_6010.jpg?sign=1739115108-ihrOya02UjvILlTkHXq5YtH4247QBeTk-0-69b7d27842431e24e0943082f71ff4ec)
图3.10 计算补码的简单方法