溢出以及判断溢出的两种方法(单符号位和双符号位)

文章讲述了补码运算中的溢出问题,介绍了单符号法和双符号法的判断方法,并通过实例演示了正溢、负溢和如何避免溢出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先让我们看一道题目

设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

   (这时候我们就可以根据双符号位的规则看出发生了负溢)

总结以上,得出补码相加的规则:

  1. 两数符号不同,相加的结果即为和的补码。
  2. 两数符号相同,相加后若其和的符号不变, 则结果是和的补码。
  3. 两数符号相同,相加后若其和的符号改变, 则表示发生了溢出。
  4. 两个正数相加,结果的符号为“01”,表示发生正溢出。
  5. 两个负数相加,结果的符号为“10”,表示发生负溢出。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值