0

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

  0100 0110 
 -1011 1111
  1000 0111

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

4

3 回答 3

0

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

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

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

于 2020-12-18T23:15:04.253 回答
0

简而言之,溢出标志仅在两种情况下打开: 1.如果两个符号位为“off”(0)的数字之和产生一个符号位为“on”(1)的结果数字。2.如果符号位为“on”(1)的两个数字之和产生一个符号位为“off”(0)的结果数。

于 2021-07-24T15:40:04.777 回答
0

所以我们知道 a - b = a + (-b) 和二进制补码 -b = ~b + 1 所以 a - b = a + ~b + 1。这就是处理器在逻辑上要做的事情

         1  <--- here is the plus one
  01000110 
+ 01000000  <--- ~b
==========

填入

 010000001
  01000110 
+ 01000000
==========
  10000111

顶行是每个位的进位/进位,左侧悬空的零是 8 位减法/加法的进位。请注意,一些处理器将其反转为进位标志,称其为借位(如果原始操作是减法),其他处理器只需将其复制到进位标志中,您必须知道它不是借位。

我们在这里看到两件事,两种检测有符号溢出的方法(进位标志是无符号溢出)。查看有符号溢出的最简单方法是,如果 msbit 的进位和进位不匹配,在这种情况下,进位是 0,进位是 1,它们不匹配,这是有符号溢出,如果程序员认为这些位(逻辑不认为它们有符号或无符号,二进制补码的美丽)是有符号的,那么这个结果不适合 8 位,所以结果不正确。

有一种方法可以从符号位和结果中检测到它,但是您必须像上面那样使用加法反转第二个操作数。如果操作数的最高有效位(b 反转)彼此匹配,但结果不匹配,则它是有符号溢出。因此,如果我们以真值表类型的形式来看这个

abi cr
000 00 
001 01 <---
010 01
011 10
100 01 
101 10
110 10 <--
111 11 

a 和 b 是操作数 i 是进位,c 是进位,r 是结果。i 和 c 不相等的两种情况是有符号溢出。如果你看这条规则适用于如果 a = b 和 r != b 那么有符号溢出。

这是知道的两种方法,但是你必须反转 b,一个补而不是两个。通常变量没有办法获得额外的位。您可能希望在高级语言中使用 16 位变量来执行此 8 位数学运算,并且您需要使用 7 位执行两次,使用 8 位执行一次以查看进位和执行。或者,您使用 if a = b 和 r!=b 作为 msbit,除了用减法进行数学运算外,不必做太多工作,然后按原样使用 a 操作数和 b 的 msbit 的补码. 那么工作量真的少吗?得写出来才能看到。

说/认为“有符号溢出”比说/认为“溢出”更安全,因为这种形式的溢出与使用二进制补码表示负数的有符号数的加法和减法有关。同时了解这些操作的进位/进位标志是“无符号溢出”。如果您发现执行该操作的逻辑(并使用相同的标志)类似于 0x40 * 0x40 = 0x1000 但使用不输出 16 位 0x40 * 0x40 = 0x00 的 8 位乘法器和它溢出了。请注意,并非所有处理器都关心。有些会支持 nbit * nbit = 2*nbit ,它可以处理所有组合,但是你需要有一个有符号的乘法和一个无符号的乘法,这是另一个主题。

于 2020-12-18T12:17:03.387 回答