几乎所有的教程都把OF(overflow)翻译成溢出标志,但如果从中文上来理解既然是溢出 那么
下面的计算
add eax,ecx//eax=0xFFFFFFFF,ecx=0x00000001
结果 eax应该=0x100000000 肯定是容纳不下溢出了。
但实际并不是如此 即使如上计算OF任然是0。并未置1.
这里给我们太多的惊讶了,天啦难道这个溢出标志是个水货。
但在写个程序测试下 依然用add
add eax,ecx//eax=0x7FFFFFFF,ecx=0x00000001
结果 eax应该=0x80000000 eax绝对容纳得下这个数据。
但OF=1了;
怎么会这样呢;
这次再换个 用减的
SUB eax,ecx//eax=0x80000000,ecx=1;
结果 eax应该=0x7FFFFFFF eax容纳得下这个数据。
结果又 OF=1了;
要晕掉了 这 OF算什么溢出标志啊!我也搞糊涂了。
但是 是否看出规律了??????
如果我们将 eax都当着有符号型的数来看 (最高位为符号位)
add eax,ecx//eax=0x7FFFFFFF,ecx=0x00000001
这个 正数+正数=负数了!
SUB eax,ecx//eax=0x80000000,ecx=1;
这个 负数-正数=正数了!
这时我们再来推测OF的作用吧,首先计算时将所有的数据都当成有符号型的数(即使实际编程中 你使用的是无符号型数据),如果计算后的数据(依然当着有符号型)不合理了:
如 正数+正数=负数了! 负数-正数=正数了则置1!
所以OF在加减法运算中如果仅从字面上来理解溢出标志是非常不合理的。 乘除运算也会牵涉到上述计算“合理性”判断置位,同时也只有乘法运算中才会有真正中文意义上的溢出。