CF(Carry Flag)與 OF(Overflow Flag)是 x86 處理器判斷運算結果是否超出範圍的兩大標誌,分別服務於無符號與有符號運算。混淆二者是逆向、編譯器開發、底層調試的常見陷阱。
| 標誌 | 服務對象 | 含義 | 結果正確性 |
|---|---|---|---|
| CF (Carry Flag) | 無符號數 | 最高位產生進位(加法)或借位(減法) | 結果在無符號意義下仍正確 |
| OF (Overflow Flag) | 有符號數 | 結果超出有符號數表示範圍 | 結果在有符號意義下錯誤 |
| 運算 | 十六進制 | 無符號解釋 | CF | 有符號解釋 | OF |
|---|---|---|---|---|---|
| 3AH + 7CH | B6H | 58+124=182(在範圍內) | 0 | 58+124=182(超出 +127) | 1 |
| AAH + 7CH | 126H | 170+124=294(超出 255) | 1 | -86+124=38(在範圍內) | 0 |
同號相加,結果異號 → 溢出。
異號相加,永不溢出。
減法轉加法:被減數 - 減數 = 被減數 + (-減數),同理判斷。
處理器同時計算 CF 和 OF,**由指令語義決定關注哪個**:
JC/JNC(Jump if Carry/Not Carry)。JO/JNO;條件跳轉 JG/JL/JGE/JLE 綜合使用 SF、ZF、OF。unsigned 類型運算依賴 CF 語義,有符號溢出屬於未定義行為(UB),現代編譯器優化假設不發生溢出。Math.addExact)。CF = 無符號世界的邊界哨兵,OF = 有符號世界的邊界哨兵。同一組位模式,解釋不同,邊界不同。寫匯編、看反編譯、調試崩潰時,**先確定變量語義(有符號/無符號),再看對應標誌**,切勿混淆。