计算机判断溢出的原理?

作者:北极
链接:https://www.zhihu.com/question/22199029/answer/55877219
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

计算机中说的溢出(OF)一般是指补码模式的加减运算的条件下。

补码模式有这么几个计算、转化规则:

-[X] = [-X]
+[Y] = [+Y]
-[-[X]] = [X]

并且计算遵循交换律,证明过程不展开说了,反正这是补码设计的原则。

然后再看计算机一共有多少种加减计算:

对于加法来说,操作数符号可能是:

1. [正] + [正]
2. [正] + [负]
3. [负] + [正]
4. [负] + [负]

对于减法来说:

1. [正] - [正] 相当于加法里的(2)
2. [正] - [负] 相当于加法里的(1)
3. [负] - [正] 相当于加法里的(4)
4. [负] - [负] 相当于加法里的(3)

所以加法和减法是一个东西,那么就只看加法。

加法里,哪种操作会溢出?

对于一个有N位二进制的补码,其能表示的数字的范围是:

-2^(N-1) ~ +2^(N-1)-1

负数:-2^(N-1) 到 -1
正数:1 到 2^(N-1)-1

那么对于加法来说:

“[正] + [负]”或者“[负] + [正]”永远都不会溢出,不管两个操作数取值多少,结果都落在有效范围内。

而超出有效范围的两种可能性就是:
1. [正] + [正]
2. [负] + [负]

那么再看这两种操作如果超出范围的话,表现形式是什么样的:

定义两个事件:

1. 最高有效位进位:对于N位补码,第N-1位发生了进位;
2. 符号位进位:对于N位补码,第N位符号位发生;

定义4个边界值,以8位有效字长为例:
最大正127 (0111 1111)
最小正1 (0000 0001)
最小负-128(1000 0000)
最大负-1 (1111 1111)

列出所有组合(消除交换律重复)
                     符号位 最高有效位  是否发生溢出  最高有效位进位  符号位进位
[最小正] + [最小正]   0 0      0 0          N             N            N
[最小正] + [最大正]   0 0      0 1          Y             Y            N
[最小正] + [最小负]   0 1      0 0          N             N            N
[最小正] + [最大负]   0 1      0 1          N             Y            Y
[最大正] + [最大正]   0 0      1 1          Y             Y            N
[最大正] + [最小负]   0 1      1 0          N             N            N
[最大正] + [最大负]   0 1      1 1          N             Y            Y
[最小负] + [最小负]   1 1      0 0          Y             N            Y
[最小负] + [最大负]   1 1      1 0          Y             N            Y
[最大负] + [最大负]   1 1      1 1          N             Y            Y

所以,从规律上看凡是发生溢出操作,“最高有效位进位”和“符号位进位”必然是一个是Y另一个是N,凡是不发生溢出的操作,必然是两个全Y或者两个全N

这就是根据最高有效位和符号位发生进位的异或来判断是否溢出规律。

下面是逻辑证明环节,很绕,证明方法很简单,就是把几种条件都列出来判断一下即可:

[正]+[正]溢出,因为两个都是正整数,所以符号位都是0,溢出时最高位发生了进位,但因为符号位是0,0加上进位的1是永远不会发生进位的。所以对于前面定义的两个事件:“最高有效位进位”发生了,“符号位进位”未发生。

[正]+[负]不溢出时,此时设正数范围包括0:

如果结果为负整数,因为第二个操作数的符号位是1,结果的符号位也是1,那么“符号位进位”未发生,同时“最高有效位进位”也未发生。因为如果发生了,会产生一个进位1,与符号位1相加会倒是符号位变化,而此时符号位是不变的,所以可以肯定两个事件都没有发生。

如果结果为正整数,那么必然同时发生了“最高有效位进位”和符号位进位”,因为第二个操作数的符号位是1,但结果符号位是0,所以符号位有进位(1 + 0 + X = 10)。而第一个操作数的符号位又是0,所以必然是最高有效位产生了一位进位才让符号位获得了一个1才能进位,对于符号位的计算来说[正]符号位0 + [负]符号位1 + 最高有效位进位X = 10,X必然是1

[负]+[负]溢出,因为两个都是负整数,所以符号位都是1,溢出时符号位发生了进位(两个都是1)。再看最高有效位是否有进位,对于8位的负数加法来说,产生溢出,意味着结果范围在-129~-256之间,这个范围内的二进制数,以9位补码来看,就是1 0111 1111到1 0000 0000,那么这两个数如果减掉符号位相加的1 0000 0000的话,得到的结果就是 0111 1111到0000 0000,这个范围内的数字第8位都是0,所以从符号位的计算可以得知[负]符号位1 + [负]符号位1 + 最高有效位进位X = 10,最高有效位的进位值必然是0,所以最高有效位必然没有发生进位。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值