assembly - 如何确定是否为混合符号二进制加法打开/关闭溢出标志?
问题描述
我仍然不完全理解溢出标志,但是从我收集的信息来看,如果两个最高有效位都是正数并导致负数,反之亦然,溢出标志就会打开。但是在混合符号二进制的情况下呢?我目前的问题是 70 - -65,二进制是
0100 0110
-1011 1111
1000 0111
我假设在这种情况下溢出标志将被打开,因为 135 超出了 -128 到 127 的范围。这是正确的,是否有更好的方法来查找溢出标志是否打开/关闭?
解决方案
减去相反的符号值可能会导致有符号溢出,因此添加相同符号的值也可以。反过来,不,因为结果不会比任何一个输入更远离零。
如果您想了解 ALU 如何从二进制位计算它,请参阅二进制算术中的 CARRY 标志和 OVERFLOW 标志以获取解释和工作示例。
不过,CPU 硬件如何实际实现它基本上是无关紧要的。它只是按照我们想要的方式工作,只要精确的数学结果超出该整数宽度的值范围,就设置溢出标志。否则它会被清除,并且签名的结果不会换行。例如120 + 10
,如果在 8 位中完成,则会出现有符号溢出,因为 130 超出了有[-128..127]
符号 8 位 2 的补码范围。-128 + (-10)
或将如此-128 - 10
。
但不是-128 - (-10) = -118
推荐阅读
- java - for循环java中的计数器
- memory - 使用我的程序运行时,valgrind 给出非法操作码和错误指令错误
- javascript - 使用箭头函数将参数传递给回调函数
- c# - 在 XAML 中使用标记扩展作为属性 Setter 的值。{0} 对 Setter.Value 无效。唯一支持的 MarkupExtension 类型是
- postgresql - 如何添加具有递增整数值的列,但仅在另一列中的值更改时才递增
- ruby-on-rails - 尝试在我的应用程序上实现 post favouris
- php - php中的ajax发布方法
- swift3 - 如何使用故事板设置 uiview 的高度从 iphone 到 ipad 不同
- php - Ubuntu 16.04 PHP 7 PECL rar 无法运行
- arrays - 难以从 fortran 中的 netcdf 文件中读取 2D 字符数组变量