溢出以及判断溢出的两种方法(单符号位和双符号位)
先让我们看一道题目
设X=-110011,Y=+100011,用补码求Z=X-Y。
解: [X]补=1 001101
????????[Y]补=0 100011
????????[-Y]补=1 011101
????????[X-Y]补= [X]补+[-Y]补 =1 001101+1 011101=0 101010
? ? ? ? 那这时候Z=X+Y=+101010
? ? ? ? 结果居然是正值,这很明显就是错误的(负数减正数结果应该还是负数)
出错的原因:
- 两个正数太大:产生进位而改变了符号位。
- 两个负数绝对值太大:对应的补码太小,不能向符号位产生进位,使符号位相加后,向前产生进位。
那什么是溢出呢?
溢出:指运算结果超过了机器数能表示的范围。
- 两个正数相加,结果大于机器所能表示的最大正数,称为上溢。
- 两个负数相加,结果小于机器所能表示的最小负数,称为下溢。
到这时候其实我们就可以引出一些思考
两异号数相加或两同号数相减是否会产生溢出?
仅当两同号数相加或两异号数相减时才有可能产生溢出?
很显然两异号数相加或两同号数相减决不会产生溢出。
也确实只有两同号数相加或两异号数相减时才有可能产生溢出。
证明就不多赘述了。
那怎么判断是否溢出呢?
就轮到今天的主角了——单符号法和双符号法
单符号位法
- 最高有效位无进位且符号位有进位时产生下溢
- 最高有效位有进位且符号位无进位时产生上溢
我个人总结就是最高位和次高位异或结果为1的话就证明产生了溢出。
双符号位法
不管是否发生溢出,高位符号位代表了数真正 的符号
Test
1、设X=+10101,Y=-01010,用补码求Z=X-Y。
解:[X]补= 00 10101,[Y]补=11 10110
?????????????????????????????????????[-Y]补=00 01010
???????[X-Y]补=[X]补+[-Y]补 =00 10101+00 01010=00 11111(无溢出)
???????所以X+Y=+11111。
2、两个定点小数X=+0.10111,Y=+0.10001,用 补码求Z=X+Y。
解:[X]补= 00.10111
???????[Y]补=00.10001
???????[X+Y]补= [X]补+[Y]补 =00.10111+00.10001=01.01000
? ? ? ?(这时候我们就可以根据双符号位的规则看出发生了正溢)
3、设X=-110011,Y=+100011,用补码求Z=X-Y。
解:[X]补=11 001101 [Y]补=00 100011
????????????????????????????????[-Y]补=11 011101
?????[X-Y]补= [X]补+[-Y]补 =11 001101+11 011101 =10 101010
? ?(这时候我们就可以根据双符号位的规则看出发生了负溢)
总结以上,得出补码相加的规则:
- 两数符号不同,相加的结果即为和的补码。
- 两数符号相同,相加后若其和的符号不变, 则结果是和的补码。
- 两数符号相同,相加后若其和的符号改变, 则表示发生了溢出。
- 两个正数相加,结果的符号为“01”,表示发生正溢出。
- 两个负数相加,结果的符号为“10”,表示发生负溢出。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!