進位標誌和溢出標誌
這次大概總結一下進位標誌(Carry Flag, CF)和溢出標誌(Overflow Flag, OF)的含義和理解方式
首先明確一點基本認識,處理器本身並不在意也不知道參與算術運算或者邏輯運算的操作數是有符號的還是無符號的。ALU總是爲給定的操作數做二進制運算,並根據結果設置相應的標誌位。
因此,視參與運算的整數的實際情況,CF或者OF會被獨立的置位或者清零。他們的含義是有程序設計者賦予的,在進行無符號運算時,我們需要檢查CF來確定運算結果是否正確,而在進行有符號運算時,則通過檢查OF來判斷結果是否發生溢出。
1. Carry Flag
CF
會在兩種情況下變成1:
- 運算結果的最高有效位向更高位進位
- 運算結果的最高有效位從更高位借位
只要在這兩種情況以外,CF
總是0。
2. Overflow Flag
OF
會在下面兩種情形變爲1:
- 兩個最高有效位均爲0的數相加,得到的結果最高有效位爲1
- 兩個最高有效位均爲1的數相加,得到的結果最高有效位爲0
除了這兩種情況以外,OF
爲0。
使用補碼錶示有符號數時,最高有效位爲0表示正數,最高有效位爲1表示負數。因此上面的論述也可以表示爲,兩個正數相加得到負數,或者兩個負數相加得到正數時 OF
置位,否則復位。
對於減法來說也是一樣的,正數減去負數得到負數,或者負數減去正數得到正數則 OF
置位,否則均復位。
有符號數溢出總是發生在 0x7f-0x80
這個位置,也就是符號改變的時候。異號的兩個數字求和結果位於他們之間,只要操作數本身沒有溢出那麼結果肯定就不會溢出,因此正數和負數相加不可能導致 OF
置位。
此外,OF
還有另一種理解方式,當次高位向最高有效位的進位值和最高有效位的溢出值不同的時候,OF
爲1,否則爲0。顯然這個規律可以通過亦或運算來表示:$OF=Carray_In \bigoplus Carry_Out $ 。