# Décimal codé binaire

Le décimal codé binaire (DCB) (binary coded decimal ou BCD en anglais), est un système de numération utilisé en électronique numérique et en informatique pour coder des nombres en se rapprochant de la représentation humaine usuelle, en base 10. Dans ce format, les nombres sont représentés par un ou plusieurs chiffres compris entre 0 et 9, et chacun de ces chiffres est codé sur quatre bits :
Ainsi, pour coder un nombre tel que 127, il suffit de coder chacun des chiffres 1, 2 et 7 séparément, et l'on obtient la valeur 0001 0010 0111. De même pour le nombre 420, chacun des chiffres 4, 2 et 0 est codé en binaire, ce qui donne 0100 0010 0000.
Étant donné que quatre bits peuvent en théorie représenter 16 valeurs distinctes et que l'on se restreint à dix valeurs possibles, on note une augmentation du nombre de bits requis pour représenter un nombre lors de l'utilisation du format DCB. Ainsi, pour représenter la valeur 12 (1100 en binaire naturel, 0001 0010 en DCB), il faudra utiliser 4 bits de plus au format DCB qu'en binaire naturel. Plus généralement 8 bits permettent de coder une valeur comprise entre 0 (0000 0000) et 99 (1001 1001) en DCB, là où l'utilisation d'un code binaire naturel permettrait de représenter des valeurs allant jusqu'à 255 (1111 1111).
Certains systèmes mettent à profit la possibilité pour les 4 bits DCB de prendre des valeurs supérieures à 9 afin de coder des informations supplémentaires, comme notamment le signe du nombre représenté. Par exemple, les valeurs 12 (1100) et 13 (1101) sont couramment utilisées pour coder le signe plus (+) et le signe moins (−) respectivement, le nombre négatif -420 pouvant ainsi être représenté par 0100 0010 0000 1101 (avec le signe à la fin). Le codage du signe peut également utiliser des valeurs différentes.
Le codage DCB rend possible l'exactitude de la représentation des nombres décimaux (« nombres à virgule ») et des calculs qui en découlent. Cette particularité permet notamment d'éviter des erreurs d'arrondi lors de la saisie et de l'affichage de ces nombres et d'éviter des comportements indésirables dans certains programmes informatiques :
D'une manière générale, dans les notations à virgule fixe ou flottante, un nombre X est représenté par deux nombres entiers relatifs N et E tels que X = N × B$^E$, où B est la base de numération (2 en codage binaire, 10 en codage DCB). N correspond à la mantisse affectée du signe ; E est l'exposant (qui est implicite dans les notations à virgule fixe).
Ainsi, en DCB (B = 10) il est possible de représenter le nombre décimal X = 0,1 par deux nombres entiers relatifs N et E tels que N = 10$^{-(E+1)}$ (par exemple N = 1000 et E = -4). Le calcul de Y = X × 200 donne exactement Y = 20 et l'expression booléenne « Y ≥ 20 » est vraie.
Comparativement, en binaire naturel (B = 2) la représentation du nombre décimal X = 0,1 ne peut pas être exacte. Elle est nécessairement approchée. Par exemple, avec N codé sur un mot de 16 bits signé, au mieux on peut écrire 0,1 ≈ 26214 × 2$^{-18}$ (soit environ 0,099998) avec N = 26214 et E = -18. Le calcul de Y = X × 200 donne alors Y = 327675 × 2$^{-14}$ (soit environ 19,9997) et, en l'absence d'un arrondi qui corrigerait opportunément l'erreur commise, l'expression booléenne « Y ≥ 20 » est fausse, avec pour possible conséquence des différences dans le déroulement du programme informatique qui exploite la valeur de cette expression.

## Formats de stockage des valeurs DCB

Dans la plupart des ordinateurs, la taille minimale d'une donnée est d'un octet, soit 8 bits. Deux méthodes communes permettent d'enregistrer les chiffres DCB de 4 bits dans un tel octet :
* ignorer les quatre bits supplémentaires de chaque octet en leur attribuant une valeur fixe (0 ou 1 comme pour EBCDIC) - format étendu.
* enregistrer deux valeurs DCB par octet, ce qui est appelé le « packed » DCB (qui peut utiliser un signe : 1100 pour + et 1101 pour −) - format compacté.
Selon la méthode, le nombre 127 sera représenté par 11110001, 11110010, 11110111 en EBCDIC ou par 00010010, 01111100 en « packed » BCD.
Bien que le DCB gâche de l'espace (environ 1/6 de la mémoire disponible est perdu en format compacté, et largement plus en format étendu), il permet d'avoir une correspondance immédiate avec les codes de caractères ASCII ou EBCDIC représentant les chiffres : il suffit de réaliser un OU logique avec 00110000 (48 en base 10) pour l'ASCII, ou 11110000 pour l'EBCDIC. Les grands nombres sont facilement affichés sur des afficheurs à 7 segments en séparant les entiers. Le BIOS des PC conserve, en général, la date et l'heure en format DCB, probablement pour des raisons historiques (cela évite une conversion de nombre décimal en ASCII). L'utilisation du format étendu pour stocker les dates « AAMMJJ » est en grande partie à l'origine du bogue de l'an 2000.
La représentation du signe dans le codage DCB est souvent portée par l'octet le plus à droite contrairement au système binaire. Dans le cas d'un codage compacté, les 4 bits de poids faible de cet octet sont utilisés pour représenter le signe (on perd donc la représentation d'un chiffre), et dans le cas d'un codage étendu, ce sont les 4 bits de poids fort. Sur un ordinateur central par exemple le nombre −215 sera représenté (en HEXA) F2F1D5 ou 215D et le nombre 215 sera représenté F2F1C5 ou 215C. Il est à noter qu'en aucune manière cette représentation ne permet de calculer directement des nombres décrits selon ce codage, les instructions permettant un calcul commencent toujours par déterminer le signe des opérandes avant de réaliser le calcul avec les valeurs absolues des opérandes que la plupart des processeurs supportent.
Aujourd'hui, ces représentations sont utilisées par la plupart des SGBD pour représenter le format DECIMAL ou NUMERIC qui permettent de stocker des nombres plus grands que les entiers et plus précis que les nombres à virgule flottante.

## Électronique

Le DCB est très commun dans les systèmes électroniques lorsqu'une valeur numérique doit être affichée, spécialement dans les systèmes constitués de circuits numériques ne contenant pas de microprocesseur (un chronomètre par exemple). En utilisant le DCB, la manipulation des données numériques est grandement simplifiée en traitant chaque chiffre dans un seul sous-circuit. Ce fonctionnement est le plus proche du matériel d'affichage (pour un afficheur 7 segments notamment).
Si la quantité numérique était stockée et manipulée en binaire, il faudrait une interface de traduction complexe. En utilisant le DCB dans tout le système, le circuit électronique s'en trouve simplifié.