补码加减运算及溢出判断

来源:互联网 发布:热网远程监控系统数据 编辑:程序博客网 时间:2024/05/16 06:54

加法运算:
[x+y]补=[x]补+[y]补
可直接相加。
减法运算:
[x-y]补=[x]补+(-[y]补)
x的补码加上y补码的相反数。(符号也要相反)(称为机器负数)。

溢出判断:

            首先要明白,一个正数和一个负数相加,结果一定不会溢出(因为结果的绝对值一定小于两个加数的绝对值,两个加数都表达出来了,结果一定能表达出来。)            所以,发生溢出的情况一定是符号相同的两个数相加。            分情况讨论:                                --正+正--                                符号位0,数位相加,如果结果的符号位变成1了,那一定是两个加数的最高位相加进上来的。                                发生溢出。                                --负+负--                                符号位都是1,所以符号位一定会进位。数位相加,如果最后符号位是0,说明结果变成正的了,那一定是发生溢出了(负+负!=正)。                                在这里要理解一下,“为什么负数补码最高位相加,发生进位的不是溢出,反而不进位是溢出呢?难道和正数不一样吗?”                                在补码发生溢出的情况中,正数是因为太大发生溢出;但是负数是因为它太小发生的溢出。(-5-5 -> 1011+1011 = 10110 ->0110 溢出),有进位说明两个负数较大。

综上:
当符号位和最高位都没有进位(正数相加)或符号位和最高位都有进位(负数相加),没发生溢出。
只有一个发生进位的,发生溢出。

双符号位判断溢出:
原来符号位只有一个,现在为了方便再加一个。
正数:00 负数 11
结果01时,结果为正,发生正溢出(正数太大了)
结果10时,结果为负,发生负溢出(负数太小了)
还是00或11就是没有溢出了。
有人会问,难道负溢出就不会是11了吗?
举例:我们想让结果进位到符号位,又要让加数最小(绝对值最大,这样才能溢出)
11100是最好的用例(这是发生进位的最小补码)。
我们把两个 11100 相加
11100+11100=111000 -> 11000 这时发生溢出了吗?
11000是-8,加数 11100是-4。
没有发生溢出。

移位运算:

算数移位:在二进制中,算数移位的左移 每移一位表示*2,右移/2
原码移位,符号位不参与移位
补码移位,符号位参与移位。左移时符号位左移,右移时符号位不变,最高位补符号位。

逻辑移位:把数字看成一串二进制数,让怎么移就怎么移,符号位和数位没区别。

原创粉丝点击