如何判断原码加减乘除的溢出

319 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情

方法一:采用一位符号位

设A的符号为As,B的符号为Bs,运算结果的符号为Ss,则溢出逻辑表达式为

V=AsBs_Ss+ _As_BsSs

若V=0,表示无溢出;

若V=1,表示有溢出。

逻辑表达式

与:如ABC,表示A与B与C仅当A、B、C均为1时,ABC为1 A、B、C中有一个或多个为0,则ABC为0

或:如A+B+C,表示A或B或C 仅当A、B、C均为0时,A+B+C为0 A、B、C中有一个或多个为1,则A+B+C为1 非:如_A,表示A非 若A为1,则 _A为0

若A为0,则 _A为1

背后的逻辑

image.png

之所以用这个表达式,是因为电路中有相应的硬件控制,与门、或门、非门

image.png

方法二:采用双符号位

设机器字长为8位(含1位符号位),A=15,B=-24,求[A+B]补和[A-B]补

C= 124,求[A+C]补和[B-C]补

[A+C]补=0,0001111+0,1111100 = 1,0001011 真值-117 [B-C]补=1,1101000+1,0000100 = 0,1101100 真值+108 正确的符号位 实际的符号位

采用双符号位

正数符号为00,负数符号为11 [A+C]补=00,0001111+00,1111100 = o1,0001011 上溢

[B-C]补=11,1101000+ 11,0000100=10,1101100 下溢 记两个符号位为Ss1 Ss2,则V=Ss1 + Ss2 若V=0,表示无溢出; 若V=1,表示有溢出。

[A+B]补=00,0001111+11,1101000= 11,1110111 [A-B]补=00,0001111+00,0011000=00,0100111

符号位补码又称:模补码

单符号位补码又称:模2补码

注意:双符号位不会增加符号位的存储

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

溢出:同号的数字相加得到异号的数字

符号扩展:反码的最后一个1的前面与反码规则一样,这个1和后面的数字与原码保持一致

image.png