上一小节我给大家挖了一个坑,这一小节我们讲一下如何溢出判断,填下这个坑
加减运算和溢出判断
1.原码
1.1加法
原码加法有四种情况,正数+正数 正数+负数 负数+正数 负数+负数
正+正 ---->绝对值做加法,结果为正
负+负 ---->绝对值做加法,结果为负
正+负/负+正 ------>绝对值大的减去绝对值小的,结果符号和绝对值大的一样
有一个注意的是,如果原码正+正或者负-负可能会出现溢出的情况
1.2减法
减法操作可以转变成加法操作,然后继续用加法的操作来处理
我们知道原码加法用电路实现比较难,所以我们一般都会原码转补码,用补码来实现加减运算
2.补码
[A+B]补=[A]补+[B]补
例1:A=15,B=-24,求[A+B]补
[A]原=0,0001111 [A]=0,0001111
[B]原=1,0011000 [B]补=1,1101000
[A+B]补=[A]补+[B]补=0,0001111+1,1101000=1,1110111
转成原码[A+B]原=1,0001001 真值=-9
例1:A=15,B=-24,求[A-B]补
[-B]补=[B]补全部位取反,末位+1,[-B]补=0,0011000
[A-B]补=[A]补+[-B]补=0,0001111+0,0011000=0,0100111
[A-B]原=0,1011001 真值=+39
通过以上的联系,相信大家对于补码的运算,已经非常熟悉了
3.溢出判断(补码)
溢出是怎么产生的呢?举个例子
当正数+正数超过了机器字长所能表示的最大范围就会溢出,也就是上溢
当负数+负数 超过了机器字长所能表示的最小范围就会溢出,也就是下溢
下面有三种方法判断溢出
3.1方法一
可以这么说,表示的就是左边绿色方框符号位,
表示的是右边绿色方框符号位,
表示的是红色方框符号位,个人理解就是,想要达到溢出当且仅当绿色方框都为0或者1时,红色方框是相反的,那就是溢出了
运算结果V=0时,表示红绿方框统一,没有溢出,V=1时,表示红绿方框不一样,溢出了
3.2方法二
大家来看上面这张图,如果想要达到溢出,上面两个绿框为0的情况下,下面的绿框要是1,原因方法一提到过了,简而言之,就是让上面两个绿框和下面的一个绿框相反,方法二就从进位的角度来判断溢出,如果上面两绿框都是0,那么想让下面绿框是1,必须为1,那
=0
如果上面两个绿框都为1,那想要下面绿框为0,要为0,那么
=1
从中我们得到规律,如果发生溢出,那么和
相反就行了
那判断 和
是否相同,我们可以用异或来判断。如果相同则异或为0,反之,异或为1,所以我们得到结论
3.3方法三(重点)
采用双符号位,例如得到的结果01,0001011 前一个符号位0是应该得到的符号,后一个1是实际得到的符号,如果两个不同,那么就是溢出
两个符号位没有发生溢出的情况如下
需要注意的是:虽然是两个符号位,但是实际存储只存储1个符号位,运算时会复制一个符号位
4.符号扩展
符号扩展我们之前有提到过,分为定点整数的扩展和定点小数的扩展
4.1定点整数
定点整数原码需要在符号位后面补0,如果是正整数的话,那就天下太平,因为正整数的原反补都一样。如果是负整数的话,需要原码的符号位补0之后,再根据规则转反码和补码
4.2定点小数
定点小数原码是在数值位后面补0,正小数原反补都一样,负小数就原码补0之后,再转反补,和定点整数一样