2011-09-22 98 views
2

我对理解进位标志(CF)和溢出标志(OF)有点麻烦。二进制加法/减法

下面是我的工作的一些样品的问题:

1. 1011 1111 2. 1111 0111 3. 0111 1110 --> 0111 1110 
    + 1011 0111  + 1101 1101  - 1011 0000 --> + 0100 1111 
    ___________  ___________  ___________  +   1 
    0111 0110  1101 0100      ___________ 
                 1100 1110 
  1. 符号位置的带出是1,在以符号位置的进位是0,因此= 1?
  2. 符号位置的进位是1,符号位置的进位是1,所以OF = 0?
  3. 符号位置的进位是0,进位到符号位置是1,所以OF = 1?

我想我无法理解一个无符号的溢出和适当的CF值。

回答

2

声明:我不是专家(或甚至是这个级别的代码的用户:))。

我相信carry-flag对于未签名的数据是有意义的,溢出标志对签名数据有意义。

两者都会一直生成,但是由您决定是否考虑值为无符号或二进制补码,因此取决于您注意哪个标志。

来自:http://en.wikipedia.org/wiki/Overflow_flag

在内部,通常是由一个异或内部进进,出的符号位的产生的溢出标志。由于符号位与被认为是无符号的数字的最高有效位相同,因此溢出标志是“无意义的”,并且通常在添加或减去这些数字时被忽略。

符号位是最重要的位(最左边的一个位)。

异或(XOR)是:

  • 如果既未:0
  • 如果任一:1
  • 如果两个:0

卡里-到符号位是当第二个最高有效位在添加时会生成一个值,以传送到下一列。

执行是否在将最高有效位(符号位,如果数字是二进制补码)添加在一起时必须执行。

XOR这两个值,你应该在给定的加法后得到你的溢出标志的值。

+0

无法从文章中发现它,但似乎进位标志更简单:它设置为您为“执行”确定的值。除非(可能)如果你正在做一个明确的(而不是加一个负数)减法,那么这个值就是架构相关的。有些人会借用国旗,其他人会清除国旗。 –