当两个符号相同的数相加或两个符号相异的数相减才可能产生溢出。
【例】设机器字长为8位(含一位符号位),A=15,B=-24,C=124,求[A+C]补和[B-C]补。
【分析】
[A+C]补=00001111+01111100=10001011(真值-117)
[B-C]补=[B]补+[-C]补=11101000+10000100=01101100 (真值+108)
方法一:采用一位符号位
对于A,B两个操作数:

针对上式——逻辑表达式
与:如ABC,表示A与B与C(类似于&&)当且仅当A、B、C均为1时,ABC为1
或:如A+B+C,表示A或B或C(类似于||)A、B、C中有一个或多个为1,则A+B+C=1
非:如A‾\overline{A}A,表示取反
在计算机中用硬件电路实现,方便进行溢出判断
☆也可根据数据位进位情况判断溢出
| 符号位的进位CsC_sCs | 最高数值位的进位C1C_1C1 | |
|---|---|---|
| 上溢 | 0 | 1 |
| 下溢 | 1 | 0 |
上例[A+C]补的计算结果可知,Cs=0C_s=0Cs=0,C1=1C_1=1C1=1,发生了上溢;[B-C]补,Cs=1C_s=1Cs=1,C1=0C_1=0C1=0,发生了下溢
即CsC_sCs与C1C_1C1不同时发生溢出,逻辑判断表达式V=Cs⊕C1V=C_s \oplus C_1V=Cs⊕C1,若V=0,表示无溢出;V=1,表示有溢出
方法二:采用双符号位
正数符号为00,负数符号为11
[A+C]补=000001111+001111100=010001011(上溢)
[B-C]补=111101000+110000100=101101100 (下溢)
结果中更高的符号位表示本该得到的正确的结果,第2个符号位表示实际得到的结果
用硬件判断溢出时,记两个符号位Cs1Cs2C_{s1}C_{s2}Cs1Cs2,则V=Cs1⊕Cs2V=C_{s1} \oplus C_{s2}V=Cs1⊕Cs2,
若V=0,表示无溢出;若V=1,表示有溢出。
实际存储时只存储1个符号位,运算时会复制一个符号位
补充:符号扩展
通过符号扩展,可以在一定程度上避免溢出
int -> long
8位 -> 16位
正整数(原、反、补的表示一样)数值位前面直接添补0
负整数:在原符号位和数值位中间添补,原码添0,反码、补码都添1
正小数(原、反、补的表示一样)在尾部添0
负小数:原码在尾部添0,反码在尾部添1,补码在尾部添0
本文探讨了在8位计算机字长下,如何通过符号位判断加法和减法运算中的溢出。介绍了两种方法:一种是一位符号位,利用逻辑运算判断进位;另一种是双符号位,通过比较两个符号位来确定溢出。同时,提到了符号扩展在避免溢出中的作用,以及正负整数和小数在扩展时的不同处理方式。
1万+

被折叠的 条评论
为什么被折叠?



