描述
两个有符号整数为了比较大小,可以计算二者的差,然后看状态寄存器的相关位。我们断言:
如果
,那么
且
,即零状态位为0(也就是相减结果不为0),并且符号位
的结果和溢出位
不一致的。
首先,如果,二者必然不相等,因此减法结果一定不为
,所以
很好理解。
直观上说明:
- 如果差是负数(
),则一定没有发生溢出(
);
- 如果差是非负数(
),则一定发生了溢出(
)
那么如何理解这俩个位?
理解
溢出
关于溢出。考虑一个4位的假想CPU,则一个有符号整数的表示范围显然是,如果运算结果超过
就会发生上溢出,此时会绕回到负端;同理如果运算结果小于
,就会发生下溢出,此时会绕回到正端。例如,
,因为
,因此发生了上溢出,绕回到负端就是
;又如
,因为
,因此发生了下溢出,就会绕回到正端就是
。
我们可以把数域范围想象成一个钟表:



减法与溢出
考虑减法,可以看作是
。令
,这就是说,其结果就是从
刻度按照某个方向走
步所达到的位置。显然,
,这就意味着,从
出发,顺时针最多到达
,逆时针最多到达
,如下图所示

反过来说,当二者相减后,如果,那么必有
;此时如果
即没有溢出,那么
当且仅当
当且仅当
;如果
即发生了溢出,且
说明发生了下溢出,这表明
。
综上所述,,当且仅当
且
。
总结
其实以4位考虑,有符号数的范围是。此范围任何两个互不相同的数相减,最大值是
,最小值是
。因此如果能发生下溢出,差一定是负数;如果能发生上溢出,差一定是正数。不可能差是正数但是出现下溢出的情况。
网友评论