概述
当两个符号相同的数相加或两个符号相异的数相减才可能产生溢出。
【例】设机器字长为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,表示取反
在计算机中用硬件电路实现,方便进行溢出判断
☆也可根据数据位进位情况判断溢出
符号位的进位 C s C_s Cs | 最高数值位的进位 C 1 C_1 C1 | |
---|---|---|
上溢 | 0 | 1 |
下溢 | 1 | 0 |
上例[A+C]补的计算结果可知,
C
s
=
0
C_s=0
Cs=0,
C
1
=
1
C_1=1
C1=1,发生了上溢;[B-C]补,
C
s
=
1
C_s=1
Cs=1,
C
1
=
0
C_1=0
C1=0,发生了下溢
即
C
s
C_s
Cs与
C
1
C_1
C1不同时发生溢出,逻辑判断表达式
V
=
C
s
⊕
C
1
V=C_s oplus C_1
V=Cs⊕C1,若V=0,表示无溢出;V=1,表示有溢出
方法二:采用双符号位
正数符号为00,负数符号为11
[A+C]补=000001111+001111100=010001011(上溢)
[B-C]补=111101000+110000100=101101100 (下溢)
结果中更高的符号位表示本该得到的正确的结果,第2个符号位表示实际得到的结果
用硬件判断溢出时,记两个符号位
C
s
1
C
s
2
C_{s1}C_{s2}
Cs1Cs2,则
V
=
C
s
1
⊕
C
s
2
V=C_{s1} oplus C_{s2}
V=Cs1⊕Cs2,
若V=0,表示无溢出;若V=1,表示有溢出。
实际存储时只存储1个符号位,运算时会复制一个符号位
补充:符号扩展
通过符号扩展,可以在一定程度上避免溢出
int -> long
8位 -> 16位
正整数(原、反、补的表示一样)数值位前面直接添补0
负整数:在原符号位和数值位中间添补,原码添0,反码、补码都添1
正小数(原、反、补的表示一样)在尾部添0
负小数:原码在尾部添0,反码在尾部添1,补码在尾部添0
最后
以上就是无限小熊猫为你收集整理的计组——溢出判断方法一:采用一位符号位方法二:采用双符号位补充:符号扩展的全部内容,希望文章能够帮你解决计组——溢出判断方法一:采用一位符号位方法二:采用双符号位补充:符号扩展所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复