首页 > 解决方案 > 如何确定是否为混合符号二进制加法打开/关闭溢出标志?

问题描述

我仍然不完全理解溢出标志,但是从我收集的信息来看,如果两个最高有效位都是正数并导致负数,反之亦然,溢出标志就会打开。但是在混合符号二进制的情况下呢?我目前的问题是 70 - -65,二进制是

  0100 0110 
 -1011 1111
  1000 0111

我假设在这种情况下溢出标志将被打开,因为 135 超出了 -128 到 127 的范围。这是正确的,是否有更好的方法来查找溢出标志是否打开/关闭?

标签: assemblyoverflowflagssigned-overflow

解决方案


减去相反的符号值可能会导致有符号溢出,因此添加相同符号的值也可以。反过来,不,因为结果不会比任何一个输入更远离零。

如果您想了解 ALU 如何从二进制位计算它,请参阅二进制算术中的 CARRY 标志和 OVERFLOW 标志以获取解释和工作示例。

不过,CPU 硬件如何实际实现它基本上是无关紧要的。它只是按照我们想要的方式工作,只要精确的数学结果超出该整数宽度的值范围,就设置溢出标志。否则它会被清除,并且签名的结果不会换行。例如120 + 10,如果在 8 位中完成,则会出现有符号溢出,因为 130 超出了有[-128..127]符号 8 位 2 的补码范围。-128 + (-10)或将如此-128 - 10
但不是-128 - (-10) = -118


推荐阅读