溢出標志(Overflow Flag, OF)用於**有符號數運算**結果超出當前位寬表示範圍時置 1。以 8 位為例:
表示範圍:-128 (0x80) ~ +127 (0x7F)
OF=1 表示:結果 < -128 或結果 > 127
OF=0 表示:結果在 [-128, 127] 範圍內
統一公式:將操作數轉換為十進制有符號數 → 人工計算真實結果 → 判斷是否超出範圍
例:(-100) + (-50) = -150
-150 < -128 → 超出範圍 → OF = 1
二進制演示:
10011100 (-100) = 0x9C
11001110 (-50) = 0xCE
相加:1 10001010 → 低8位 10001010 (-118), 進位=1
符號位均為1,結果符號位為1,但發生溢出
例:100 + 50 = 150
150 > 127 → 超出範圍 → OF = 1
二進制:
01100100 (100) = 0x64
00110010 (50) = 0x32
相加:10010110 (-106) 符號位變為1 → OF = 1
結論:絕不產生溢出 → OF = 0
原因:正數 + 負數 = 減法運算
結果絕對值 ≤ max(|正數|, |負數|) ≤ 127
永不超出表示範圍
轉換為加法:`A - B = A + (-B)`,其中 `-B` 為 B 的補碼(取反+1),然後按加法規則判斷。
ALU 通過最高位進位(Carry into MSB)與最高位向外進位(Carry out of MSB)異或判斷:
OF = C_in ⊕ C_out (最高位進入進位 與 最高位輸出進位 異或)
C_in = 運算最高位(第7位)產生的進位
C_out = 運算產生的最終進位標志(CF)
同號加法:C_in ≠ C_out → OF=1
異號加法:C_in = C_out → OF=0
例:10011100
符號位1→負數
取反:01100011
加1: 01100100 = 100
結果:-100
| 誤區 | 正確理解 |
|---|---|
| OF 和 CF 是一回事 | CF 針對無符號數,OF 針對有符號數 |
| 有進位就溢出 | 無符號數進位=溢出;有符號數看 OF |
| 減法不產生 OF | 減法本質是加補碼,同樣可能溢出 |
掌握核心原則:有符號數運算看 OF,無符號數運算看 CF。轉十進制人工驗證最直觀,硬件異或邏輯最本質。