# Indicateur de retenue

Dans un processeur, l'indicateur de retenue, (Carry Flag en anglais, généralement noté C) est un des bits du registre d'état utilisé pour indiquer qu'une retenue ou un emprunt arithmétique a été généré sur le bit de poids fort de l'UAL. L'indicateur de retenue permet aux nombres d'une largeur supérieur à celle d'une UAL d'être additionnés/soustraits en retenant (ajoutant), au bit de poids faible d'un mot plus grand, un chiffre binaire d'une addition/soustraction partielle. De nombreux processeurs l'utilisent également pour prolonger des décalages et rotations de bits (parfois via un indicateur dédié noté X). Lorsque la retenue d'une soustraction a lieu, deux conventions s'opposent. La plupart des appareils mettent l'indicateur de retenue à l'emprunt alors que d'autres (comme le 6502 et le PIC) l’enlèvent.

## Utilité

L'indicateur de retenue est utilisé et modifié par la plupart des instructions arithmétiques (et, plus généralement, les opérations bit à bit). La plupart de ces instructions ont deux formes suivant qu'elles utilisent l'indicateur de retenue ou non. En assembleur ces instructions sont représentées par des mnémoniques comme ADD/SUB, ADC/SBC (ADD/SUB comprenant la retenue), SHL/SHR (décalage de bit), ROL/ROR (rotation de bits), RCR/RCL (rotation conservant la retenue), etc. L'utilisation de l'indicateur de retenue permet des additions, soustractions, décalages et rotations de bit sur plusieurs mots.
Un exemple si l'on devait additionner 255 et 255 en utilisant des registres en 8 bits. Le résultat, 510, en binaire, est 1 1111 1110 et nécessite 9 bits. Les 8 bits de poids faible toujours stockés dans le registre seraient 1111 1110 en binaire (254 en décimal) mais dans la mesure où il y a une retenue du bit 7 (le huitième bit), l'indicateur de retenue est mis, indiquant que le résultat a besoin de 9 bits. La concaténation de l'indicateur de retenue avec le résultat en 8 bits donne le résultat en 9 bits. Notez que dans l'interprétation, en 8 bits, d'un complément à deux, cette opération équivaut à -1 + -1 et donne le résultat correct -2, sans débordement, même si la retenue est ignorée.
Un autre exemple peut être un registre 8 bits 0101 0101 avec l'indicateur de retenue présent; si nous effectuons une instruction rotation à gauche conservant la retenue, le résultat serait 1010 1011 avec l'indicateur de retenue effacé car le bit de poids fort (bit 7, précédemment à 0) a été mis dans l'indicateur de retenue par la rotation tandis que l'indicateur de retenue a été mis dans le bit de point faible (bit 0).
Les premiers microprocesseurs Intel 4004 et Intel 8008 disposaient d'instructions afin d'explicitement mettre ou enlever l'indicateur de retenue. Plus tard, l'Intel 8080 (et Z80) supprima ces instructions car l'indicateur de retenue pouvait être modifié aussi rapidement par les opérations bit à bit n'utilisant pas l'indicateur de retenue : AND, OR, XOR.
L'indicateur de retenue est également souvent utilisé par les instructions de comparaison, qui sont généralement implémentées par des soustractions, afin de décider laquelle des deux valeurs comparées est inférieure (ou supérieure ou égale) à l'autre. Les instructions de branchement examinant l'indicateur de retenue sont souvent représentés par les mnémoniques BCS (Branch if Carry is Set) et BCC (Branch if Carry is Clear) pour bifurquer suivant que l'indicateur de retenue est présent ou non. Cette méthode peut être utilisée pour comparer les valeurs des entiers non signés, à l'instar de l'indicateur de débordement utilisé pour comparer les valeurs des entiers signés.

## Indicateur de retenue vs. indicateur d'emprunt

Bien que le comportement de l'indicateur de retenue soit bien défini pour l'addition, il y a deux façons possibles de l'utiliser pour la soustraction.
La première l'utilise comme un indicateur d'emprunt, le mettant si a<b lors du calcul de a−b pour effectuer l'emprunt. Une instruction de soustraction avec emprunt (SBB pour SuBstract with Borrow) calculera a−b−C = a−(b+C), alors qu'une soustraction sans emprunt (SUB) s’effectuera comme si l'indicateur de d'emprunt n’était pas présent. Le 8080, Z80 ainsi que les familles x86 et 68k (entre autres) l'utilisent de la sorte.
La seconde profite du fait que −x = non(x)+1 pour calculer a−b comme a+non(b)+1. Une instruction de soustraction avec retenue calculera a+non(b)+C, tandis qu'une soustraction sans retenue s’effectuera comme si l'indicateur de retenue était présent. Le 6502 ainsi que les processeurs ARM et PowerPC utilise cette convention. Le 6502 est un exemple bien-connu car il n'a pas de soustraction sans opération de retenue, les logiciels devant donc s'assurer que l'indicateur de retenue est présent avant chaque opération de soustraction où un emprunt n'est pas nécessaire.
La convention moderne appelle "bit d'emprunt" la première façon et "bit de retenue" la seconde. Il y a cependant des exceptions dans les deux sens; les architectures VAX et NS320xx utilisent la convention "bit d'emprunt", mais appellent leur opération a−b−C "soustraction avec retenue" (SBWC SuBtract With Carry). PA-RISC utilise la convention "bit de retenue", mais appelle son opération a+non(b)+C "soustraction avec emprunt" (SUBB).
Résumé des différentes utilisations de l'indicateur de retenue en soustraction :
| Bit de retenue ou d'emprunt | Soustraction sans retenue/emprunt | Soustraction avec emprunt | Soustraction avec retenue |
| C = 0 | a − b = a + non(b) + 1 | a − b − 0 = a + non(b) + non(C) | a − b − 1 = a + non(b) + C |
| C = 1 | a − b = a + non(b) + 1 | a − b − 1 = a + non(b) + C | a − b − 0 = a + non(b) + non(C) |