计组——溢出判断

当两个符号相同的数相加或两个符号相异的数相减才可能产生溢出。
【例】设机器字长为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
上溢01
下溢10

上例[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=CsC1,若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=Cs1Cs2
若V=0,表示无溢出;若V=1,表示有溢出。

实际存储时只存储1个符号位,运算时会复制一个符号位

补充:符号扩展

通过符号扩展,可以在一定程度上避免溢出
int -> long
8位 -> 16位
正整数(原、反、补的表示一样)数值位前面直接添补0
负整数:在原符号位和数值位中间添补,原码添0,反码、补码都添1

正小数(原、反、补的表示一样)在尾部添0
负小数:原码在尾部添0,反码在尾部添1,补码在尾部添0

  • 6
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值