![你好,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=1738923525-odqcCshFwy5ejfbEmvnQZQ2nSVqCqKLH-0-3a81e3d1cb4a565090a8c54c0f96189d)
图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=1738923525-O8qAJcE36tBaSISFWIh9XONxlhWr5EB3-0-344bb64a88849f2b28e50efa479a4154)
图3.7 时钟5-5
![](https://epubservercos.yuewen.com/15A18E/31398146107521006/epubprivate/OEBPS/Images/Figure-P45_6008.jpg?sign=1738923525-8AKakLdBygX7WRPdijcgD1H1L5OEapkc-0-5f2ecf08b078216eb4f8fcb30b637445)
图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=1738923525-zXUvPpDHULahAfw8m9ShIdptZi4di69U-0-6a42ae5f4c8ee0ad4389e2406f709bf4)
图3.9 负数的补码为模与正数的差的二进制
![](https://epubservercos.yuewen.com/15A18E/31398146107521006/epubprivate/OEBPS/Images/Figure-P45_6010.jpg?sign=1738923525-8b1TNA7ohlT8NEUnv7o3vhkwiRtmmsUg-0-558f404ffc7dc20029724a06a755f164)
图3.10 计算补码的简单方法