2011-09-22 111 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

無法從文章中發現它,但似乎進位標誌更簡單:它設置爲您爲「執行」確定的值。除非(可能)如果你正在做一個明確的(而不是加一個負數)減法,那麼這個值就是架構相關的。有些人會借用國旗,其他人會清除國旗。 –