進位旗標

進位旗標（carry flag）簡稱為C，是处理器裡狀態暫存器的位元，表示算術邏輯單元計算之後，有出現进位或借位的情形。進位旗標讓處理器可以分段處理數值的相加減，先加減最低有效的運算單位（位元或是字），所得的進位再和較高有效位相加減即可。這一般會在組合語言或是機械的的級別處理，也可能在處理器內部直接用邏輯閘或微程序，也有一些處理器本身就有大於ALU寬度的暫存器或是指令其中最多人知道的是Z80和68000處理器，也有其他的處理器。。進位旗標也可以類似的方式擴展位操作和位旋轉。針對減法運算，有兩種不同的處理方式，大部份的處理器在有借位時設定進位旗標，而像MOS 6502和PIC等處理器則是在有借位時，會清除進位旗標。
用法
大部份的算術指令（以及許多的位元處理指令）會影響進位旗標，進位旗標也是許多指令的輸入。許多指令都有二個版本，一個考慮進位指令，另一個忽略進位命令。汇编语言中這些指令會用助憶碼表示，像是ADD/SUB、ADC/SBC（考慮
進位的ADD/SUB）、SHL/SHR（位操作）、ROL/ROR（位旋轉）、RCR/RCL（考慮進位的位旋轉）等。使用進位旗標可以進行多位元組的加法、減法、移位和旋轉指令。

以在8位元暫存器中將255加255做例子，其結果是510，二進制下是9位元111111110。較低的8位元可以存在暂存器內，結果是二進制的11111110（十進制的254），但其最高位元有進位，設定進位旗標，代表其結果需要9位元才能儲存。9位元的結果就是進位旗標和原暫存器串接為9位元所得的值。

x86的ALU寬度是8位元，用8位元二補數表示法表示11111111 + 11111111的加法，結果是111111110，Carry_Flag為1，Sign_Flag為1，Overflow_Flag為零。

若11111111表示二補數下的有號整數−1（ADD al,-1），則結果即為-2，因為Overflow_Flag沒有設定，且忽略Carry_Flag。結果的符號為負，因為Sign_Flag有設定。11111110是有號整數-2在二補數下的寫法'。

若11111111表示無號整數255（ADD al,255），則其結果是254，此結果不正確，因為最高位元的相加結果進位到進位旗標了Carry_Flag，因此此旗標不能省略。此時要省略Overflow_Flag和Sign_Flag。

另一個例子是8-bit寄存器裡的數值是01010101，有設定進位旗標。若進行考慮進位的左旋轉指令，其結果會是10101011，進位旗標為0，因為原來的最高位元旋轉到進位旗標，而進位旗標旋轉到最低位元。

早期的微處理器Intel 4004和Intel 8008有特別的指令可以設定和清除進位旗標。但較晚期的Intel 8080（和Z80）沒有特別清除進位旗標的指令，因為用位元的AND, OR或XOR指令也可以有一樣的效果（這些指令不會用到進位旗標）。

進位旗標也常用在比較指令中，一般會用減法指令實現，可以知道兩個比較的數字，某一個是否比另一個要小。考慮進位旗標的分支，其助憶碼是BCC and BCS，前者在沒有進位旗標時分支，後者在有進位旗標時分支。此方法可以比較無號數，而溢位旗標是用來比較有號數的大小。

 借位旗標 
進位旗標在加法裡有明確的定義，而在減法中，有兩種使用進位旗標的方法。

第一種方法把進位旗標當作借位旗標使用。在計算a−b時，若a<b，需要借位，則設定旗標。SBB指令是考慮借位的減法，會計算a−b−C = a−(b+C)，而SUB指令是不考慮借位的減法，其運算就像借位旗標為0一樣。6800、、8051、8080/Z80和x86系列都是用此處理方式。

第二種方法直接使用−x = (not x)+1（不儲存反相的進位位元），因此將a−b轉換為a+(not b)+1來計算。在此加法中，有設定進位旗標，而其考慮進位的減法會計算a+not(b)+C，不考慮進位的減法計算時就像有設定進位位元一樣。因此，當a≥b時會設定進位旗標，若a<b時會清除進位旗標。System/360、ARM、POWER/PowerPC、6502、MSP430、COP8、、i960和88000處理器都使用此作法。6502是特別多人知道的範例，因為此處理器沒有不考慮進位的減法指令，因此程式設計者需在每一個減法之前檢查，若不需考慮借位，要確認進位旗標已設定。
+ 減法中使用進位旗標的不同方式 進位或借位 不考慮進位／借位的減法 考慮借位的減法 考慮進位的減法 C = 0 a − b= a + not(b) + 1 a − b − 0= a + not(b) + 1 a − b − 1= a + not(b) + 0 C = 1 a − b − 1= a + not(b) + 0 a − b − 0= a + not(b) + 1

上述所列的處理器，其中包括過去數十年流行的處理器，將其運算稱為「考慮借位的減法」和「考慮進位的減法」。但命名很不一致。VAX、、和Atmel AVR架構使用借位位元的命名方式，但是稱其a−b−C運算是「考慮進位的減法」（SBWC, SUBC, SUBWC, SBC）。PA-RISC和PICmicro架構是用進位位元的命名方式，但稱a+not(b)+C運算是「考慮借位的減法」（SUBB和 SUBWFB）。其他處理器，像是H8系列，稱其減法為擴充減法（SUBX）。SPARC用借位的作法，SUBX助憶詞、以及「考慮進位的減法」名稱。

相關條目
 二进制

 狀態暫存器

參考資料

外部連結
 Carry Flag and Overflow Flag in binary arithmetic
 Carry Bit: How does it work?

Category:計算機算術