汇编练习:有符号数比较的相关位置状态

描述

两个有符号整数为了比较大小,可以计算二者的差,然后看状态寄存器的相关位。我们断言:

如果,那么且,即零状态位为0(也就是相减结果不为0),并且符号位的结果和溢出位不一致的。

首先,如果,二者必然不相等,因此减法结果一定不为,所以很好理解。
直观上说明:

  • 如果差是负数(),则一定没有发生溢出();
  • 如果差是非负数(),则一定发生了溢出()

那么如何理解这俩个位?

理解

溢出

关于溢出。考虑一个4位的假想CPU,则一个有符号整数的表示范围显然是,如果运算结果超过就会发生上溢出,此时会绕回到负端;同理如果运算结果小于,就会发生下溢出,此时会绕回到正端。例如,,因为,因此发生了上溢出,绕回到负端就是;又如,因为,因此发生了下溢出,就会绕回到正端就是。

我们可以把数域范围想象成一个钟表:

那么可以将算式理解为在的基础上向某个方向走了步,如果表示是顺时针,否则表示方向是逆时针。因此,可以理解为从刻度顺时针走步,可见到达:
同理,认为是,表示从的刻度开始逆时针走步,于是刚好到:

减法与溢出

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

因此,如果,那么,于是其结果就是逆时针走步,当结果是时没有发生溢出,此时结果是负数,所以有;如果发生了溢出,可以发现此时一定是下溢出,溢出后的结果只可能是,不可能出现负数(因为最远到达1,不可能又绕回到负数端),因此如果此时,那么必然有。

反过来说,当二者相减后,如果,那么必有;此时如果即没有溢出,那么当且仅当当且仅当;如果即发生了溢出,且说明发生了下溢出,这表明。

综上所述,,当且仅当且。

总结

其实以4位考虑,有符号数的范围是。此范围任何两个互不相同的数相减,最大值是,最小值是。因此如果能发生下溢出,差一定是负数;如果能发生上溢出,差一定是正数。不可能差是正数但是出现下溢出的情况。

你可能感兴趣的:(汇编练习:有符号数比较的相关位置状态)