Décimal codé binaire - Binary-coded decimal

Une horloge binaire peut utiliser des LED pour exprimer des valeurs binaires. Dans cette horloge, chaque colonne de LED affiche un chiffre décimal codé en binaire de l' heure sexagésimale traditionnelle .

Dans les systèmes informatiques et électroniques , le nombre décimal codé binaire ( BCD ) est une classe de codages binaires de nombres décimaux où chaque chiffre est représenté par un nombre fixe de bits , généralement quatre ou huit. Parfois, des configurations binaires spéciales sont utilisées pour un signe ou d'autres indications (par exemple, erreur ou débordement).

Dans les systèmes orientés octets (c'est-à-dire la plupart des ordinateurs modernes), le terme BCD non compressé implique généralement un octet complet pour chaque chiffre (y compris souvent un signe), tandis que le BCD compressé code généralement deux chiffres dans un seul octet en tirant parti du fait que quatre les bits sont suffisants pour représenter la plage de 0 à 9. Le codage précis à 4 bits, cependant, peut varier pour des raisons techniques (par exemple Excess-3 ).

Les dix états représentant un chiffre BCD sont parfois appelés tétrades (car le quartet généralement nécessaire pour les contenir est également connu sous le nom de tétrade) tandis que les états inutilisés, peu importe, sont nommés pseudo-tétrade(e)s  [ de ] , pseudo-décimaux ou chiffres pseudo-décimaux .

La principale vertu du BCD, par rapport aux systèmes positionnels binaires , est sa représentation et l'arrondi plus précis des quantités décimales, ainsi que sa facilité de conversion en représentations conventionnelles lisibles par l'homme. Ses principaux inconvénients sont une légère augmentation de la complexité des circuits nécessaires à la mise en œuvre de l'arithmétique de base ainsi qu'un stockage un peu moins dense.

Le BCD a été utilisé dans de nombreux premiers ordinateurs décimaux et est implémenté dans le jeu d'instructions de machines telles que la série IBM System/360 et ses descendants, le VAX de Digital Equipment Corporation , le Burroughs B1700 et les processeurs de la série 68000 de Motorola . Le BCD en soi n'est pas aussi largement utilisé que par le passé et il n'est plus implémenté dans les jeux d'instructions des ordinateurs plus récents (par exemple ARM ) ; x86 ne supporte plus ses instructions BCD en mode long . Cependant, les formats décimaux à virgule fixe et à virgule flottante sont toujours importants et continuent d'être utilisés dans l'informatique financière, commerciale et industrielle, où les erreurs subtiles de conversion et d' arrondi fractionnaire inhérentes aux représentations binaires à virgule flottante ne peuvent être tolérées.

Fond

BCD tire parti du fait que n'importe quel chiffre décimal peut être représenté par un motif à quatre bits. Le moyen le plus évident de coder les chiffres est le BCD naturel (NBCD), où chaque chiffre décimal est représenté par sa valeur binaire à quatre bits correspondante, comme indiqué dans le tableau suivant. Ceci est également appelé encodage "8421".

Chiffre décimal BCD
8 4 2 1
0 0 0 0 0
1 0 0 0 1
2 0 0 1 0
3 0 0 1 1
4 0 1 0 0
5 0 1 0 1
6 0 1 1 0
7 0 1 1 1
8 1 0 0 0
9 1 0 0 1

Ce schéma peut également être appelé décimal codé binaire simple ( SBCD ) ou BCD 8421 , et est le codage le plus courant. D'autres incluent les encodages dits "4221" et "7421" - du nom de la pondération utilisée pour les bits - et " Excess-3 ". Par exemple, le chiffre 6 BCD, 0110'ben notation 8421, est 1100'ben 4221 (deux encodages sont possibles), 0110'ben 7421, alors qu'en Excess-3 c'est 1001'b( ).

Codes BCD 4 bits et pseudo-tétrades
Bit Poids  0  1  2  3  4  5  6  7  8  9 dix 11 12 13 14 15         Commenter        
4 8 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 Binaire
3 4 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
2 2 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
Nom 0 1 2 3 4 5 6 7 8 9 dix 11 12 13 14 15 Décimal
8 4 2 1 (XS-0) 0 1 2 3 4 5 6 7 8 9 dix 11 12 13 14 15
7 4 2 1 0 1 2 3 4 5 6   7 8 9          
Aiken (2 4 2 1) 0 1 2 3 4             5 6 7 8 9
Excès-3 (XS-3) -3 -2 -1 0 1 2 3 4 5 6 7 8 9 dix 11 12
Excès-6 (XS-6) -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9
Saut à 2 (2 4 2 1) 0 1             2 3 4 5 6 7 8 9
Saut à 8 (2 4 2 1) 0 1 2 3 4 5 6 7             8 9
4 2 2 1 (je) 0 1 2 3     4 5         6 7 8 9
4 2 2 1 (II) 0 1 2 3     4 5     6 7     8 9
5 4 2 1 0 1 2 3 4       5 6 7 8 9      
5 2 2 1 0 1 2 3     4   5 6 7 8     9  
5 1 2 1 0 1 2 3       4 5 6 7 8       9
5 3 1 1 0 1   2 3 4     5 6   7 8 9    
Blanc (5 2 1 1) 0 1   2   3   4 5 6   7   8   9
5 2 1 1 0 1   2   3   4 5   6   7   8 9
  0 1 2 3 4 5 6 7 8 9 dix 11 12 13 14 15
Bande magnetique   1 2 3 4 5 6 7 8 9 0          
Paul   1 3 2 6 7 5 4   0     8 9    
gris 0 1 3 2 7 6 4 5 15 14 12 13 8 9 11 dix
Glixon 0 1 3 2 6 7 5 4 9       8      
Ledley 0 1 3 2 7 6 4 5         8   9  
4 3 1 1 0 1   2 3     5 4     6 7   8 9
LARC 0 1   2     4 3 5 6   7     9 8
Klar 0 1   2     4 3 9 8   7     5 6
Petherick (RAE)   1 3 2   0 4     8 6 7   9 5  
O'Brien I (Watts) 0 1 3 2     4   9 8 6 7     5  
5-cyclique 0 1 3 2     4   5 6 8 7     9  
Tompkins I 0 1 3 2     4     9     8 7 5 6
Lippel 0 1 2 3     4     9     8 7 6 5
O'Brien II   0 2 1 4   3     9 7 8 5   6  
Tompkins II     0 1 4 3   2   7 9 8 5 6    
Excès-3 Gris -3 -2 0 -1 4 3 1 2 12 11 9 dix 5 6 8 7
6 3 −2 −1 (je)         3 2 1 0   5 4 8 9   7 6
6 3 −2 −1 (II) 0       3 2 1   6 5 4   9 8 7  
8 4 −2 −1 0       4 3 2 1 8 7 6 5       9
Lucal 0 15 14 1 12 3 2 13 8 7 6 9 4 11 dix 5
Kautz I 0     2   5 1 3   7 9   8 6   4
Kautz II   9 4   1   3 2 8   6 7   0 5  
Susskind I   0   1   4 3 2   9   8 5   6 7
Susskind II   0   1   9   8 4   3 2 5   6 7
  0 1 2 3 4 5 6 7 8 9 dix 11 12 13 14 15

Le tableau suivant représente les chiffres décimaux de 0 à 9 dans divers systèmes de codage BCD. Dans les en-têtes, le " " indique le poids de chaque bit. Dans la cinquième colonne ("BCD 8 4 -2 -1"), deux des poids sont négatifs. Les codes de caractères ASCII et EBCDIC pour les chiffres, qui sont des exemples de BCD zoné, sont également affichés. 8421

 
Chiffre
BCD
8 4 2 1
 Code Stibitz ou Excess-3 Code Aiken ou BCD
2 4 2 1
BCD
8 4 −2 −1
IBM 702 , IBM 705 , IBM 7080 , IBM 1401 8421
ASCII
0000 8421
EBCDIC
0000 8421
0 0000 0011 0000 0000 1010 0011 0000 1111 0000
1 0001 0100 0001 0111 0001 0011 0001 1111 0001
2 0010 0101 0010 0110 0010 0011 0010 1111 0010
3 0011 0110 0011 0101 0011 0011 0011 1111 0011
4 0100 0111 0100 0100 0100 0011 0100 1111 0100
5 0101 1000 1011 1011 0101 0011 0101 1111 0101
6 0110 1001 1100 1010 0110 0011 0110 1111 0110
7 0111 1010 1101 1001 0111 0011 0111 1111 0111
8 1000 1011 1110 1000 1000 0011 1000 1111 1000
9 1001 1100 1111 1111 1001 0011 1001 1111 1001

Comme la plupart des ordinateurs traitent des données en octets de 8 bits , il est possible d'utiliser l'une des méthodes suivantes pour coder un numéro BCD :

  • Unpacked : Chaque chiffre décimal est codé sur un octet, avec quatre bits représentant le nombre et les bits restants n'ayant aucune signification.
  • Packed : Deux chiffres décimaux sont codés dans un seul octet, avec un chiffre dans le quartet le moins significatif ( bits 0 à 3 ) et l'autre chiffre dans le quartet le plus significatif (bits 4 à 7).

À titre d'exemple, l'encodage du nombre décimal à l' 91aide de BCD non compressé donne le modèle binaire suivant de deux octets :

Decimal:         9         1
Binary : 0000 1001 0000 0001

En BCD compacté, le même nombre tiendrait dans un seul octet :

Decimal:   9    1
Binary: 1001 0001

Par conséquent, la plage numérique pour un octet BCD non compressé est de zéro à neuf inclus, tandis que la plage pour un octet BCD compressé est de zéro à quatre-vingt-dix-neuf inclus.

Pour représenter des nombres plus grands que la plage d'un seul octet, n'importe quel nombre d'octets contigus peut être utilisé. Par exemple, pour représenter le nombre décimal 12345en BCD compacté, en utilisant le format big-endian , un programme encoderait comme suit :

Decimal:    0    1    2    3    4    5
Binary : 0000 0001 0010 0011 0100 0101

Ici, le quartet le plus significatif de l'octet le plus significatif a été codé comme zéro, donc le nombre est stocké comme 012345(mais les routines de formatage peuvent remplacer ou supprimer les zéros non significatifs ). Le BCD compressé est plus efficace en termes d'utilisation du stockage que le BCD non compressé ; encoder le même nombre (avec le zéro de tête) dans un format non compressé consommerait deux fois plus de stockage.

Les opérations de décalage et de masquage sont utilisées pour compresser ou décompresser un chiffre BCD compressé. D'autres opérations au niveau du bit sont utilisées pour convertir un nombre en son modèle binaire équivalent ou pour inverser le processus.

BCD emballé

En BCD compacté (ou simplement compacté decimal ), chacun des deux quartets de chaque octet représente un chiffre décimal. Le packed BCD est utilisé depuis au moins les années 1960 et est implémenté dans tout le matériel d'ordinateur central IBM depuis lors. La plupart des implémentations sont big endian , c'est-à-dire avec le chiffre le plus significatif dans la moitié supérieure de chaque octet, et avec l'octet le plus à gauche (résidant à l'adresse mémoire la plus basse) contenant les chiffres les plus significatifs de la valeur décimale condensée. Le quartet inférieur de l'octet le plus à droite est généralement utilisé comme indicateur de signe, bien que certaines représentations non signées n'aient pas d'indicateur de signe. A titre d'exemple, une valeur de 4 octets se compose de 8 quartets, dans lesquels les 7 quartets supérieurs stockent les chiffres d'une valeur décimale à 7 chiffres, et le quartet le plus bas indique le signe de la valeur entière décimale.

Les valeurs de signe standard sont 1100 ( hex C) pour positif (+) et 1101 (D) pour négatif (−). Cette convention provient du champ zone pour les caractères EBCDIC et de la représentation signée overpunch . Les autres signes autorisés sont 1010 (A) et 1110 (E) pour positif et 1011 (B) pour négatif. Les processeurs IBM System/360 utiliseront les signes 1010 (A) et 1011 (B) si le bit A est défini dans le PSW, pour la norme ASCII-8 qui n'a jamais réussi. La plupart des implémentations fournissent également des valeurs BCD non signées avec un quartet de signe de 1111 (F). ILE RPG utilise 1111 (F) pour positif et 1101 (D) pour négatif. Ceux-ci correspondent à la zone EBCDIC pour les chiffres sans perforation de signe. En BCD emballé, le nombre 127 est représenté par 0001 0010 0111 1100 (127C) et -127 est représenté par 0001 0010 0111 1101 (127D). Les systèmes Burroughs utilisaient 1101 (D) pour le négatif, et toute autre valeur est considérée comme une valeur de signe positif (les processeurs normaliseront un signe positif à 1100 (C)).


Chiffre de signe
BCD
8 4 2 1
Signe Remarques
UNE 1 0 1 0 +  
B 1 0 1 1  
C 1100 + Préféré
1 1 0 1 Préféré
E 1 1 1 0 +  
F 1 1 1 1 + Non signé

Quel que soit le nombre d'octets d'un mot , il y a toujours un nombre pair de quartets car chaque octet en a deux. Par conséquent, un mot de n octets peut contenir jusqu'à (2 n )−1 chiffres décimaux, ce qui est toujours un nombre impair de chiffres. Un nombre décimal à d chiffres nécessite1/2( d +1) octets d'espace de stockage.

Par exemple, un mot de 4 octets (32 bits) peut contenir sept chiffres décimaux plus un signe et peut représenter des valeurs allant de ± 9 999 999. Ainsi, le nombre -1 234,567 comporte 7 chiffres et est codé comme suit :

0001 0010 0011 0100 0101 0110 0111 1101
1    2    3    4    5    6    7    −

Comme les chaînes de caractères, le premier octet de la décimale condensée - celui avec les deux chiffres les plus significatifs - est généralement stocké dans l'adresse la plus basse en mémoire, indépendamment de l' endianisme de la machine.

En revanche, un entier de complément à deux binaire de 4 octets peut représenter des valeurs de -2 147 483 648 à +2 147 483 647.

Bien que le BCD compressé n'utilise pas de manière optimale le stockage (en utilisant environ 20 % de mémoire en plus que la notation binaire pour stocker les mêmes nombres), la conversion en ASCII , EBCDIC ou les divers encodages Unicode est rendue triviale, car aucune opération arithmétique n'est requise. Les exigences de stockage supplémentaires sont généralement compensées par le besoin de précision et de compatibilité avec la calculatrice ou le calcul manuel que fournit l'arithmétique décimale à virgule fixe. Il existe des emballages plus denses de BCD qui évitent la pénalité de stockage et ne nécessitent également aucune opération arithmétique pour les conversions courantes.

Packed BCD est pris en charge dans le langage de programmation COBOL en tant que type de données "COMPUTATIONAL-3" (une extension IBM adoptée par de nombreux autres fournisseurs de compilateurs) ou "PACKED-DECIMAL" (partie de la norme COBOL 1985). Il est pris en charge dans PL/I en tant que "FIXED DECIMAL". En plus des mainframes compatibles IBM System/360 et ultérieurs, le BCD compressé est implémenté dans le jeu d'instructions natif des processeurs VAX d' origine de Digital Equipment Corporation et de certains modèles des mainframes de la série SDS Sigma , et constitue le format natif des systèmes moyens de Burroughs Corporation . ligne d'ordinateurs centraux (descendant de la série Electrodata 200 des années 1950 ).

Les représentations du complément à dix pour les nombres négatifs offrent une approche alternative pour coder le signe des nombres BCD emballés (et autres). Dans ce cas, les nombres positifs ont toujours un chiffre le plus significatif entre 0 et 4 (inclus), tandis que les nombres négatifs sont représentés par le complément à 10 du nombre positif correspondant. En conséquence, ce système permet aux nombres BCD compactés de 32 bits d'aller de -50 000 000 à +49 999 999, et -1 est représenté par 99999999. (Comme avec les nombres binaires en complément à deux, la plage n'est pas symétrique par rapport à zéro.)

virgule fixe emballée décimale

Les nombres décimaux à virgule fixe sont pris en charge par certains langages de programmation (tels que COBOL, PL/I et Ada ). Ces langages permettent au programmeur de spécifier un point décimal implicite devant l'un des chiffres. Par exemple, une valeur décimale condensée codée avec les octets 12 34 56 7C représente la valeur à virgule fixe +1 234,567 lorsque la virgule décimale implicite est située entre les 4e et 5e chiffres :

12 34 56 7C
12 34.56 7+

Le point décimal n'est pas réellement stocké en mémoire, car le format de stockage BCD compressé ne le permet pas. Son emplacement est simplement connu du compilateur, et le code généré agit en conséquence pour les différentes opérations arithmétiques.

Encodages de plus haute densité

Si un chiffre décimal nécessite quatre bits, alors trois chiffres décimaux nécessitent 12 bits. Cependant, étant donné que 2 10 (1 024) est supérieur à 10 3 (1 000), si trois chiffres décimaux sont codés ensemble, seuls 10 bits sont nécessaires. Deux de ces codages sont le codage Chen-Ho et le décimal dense (DPD). Ce dernier a l'avantage que des sous-ensembles du codage codent deux chiffres dans les sept bits optimaux et un chiffre dans quatre bits, comme dans le BCD normal.

Décimal zoné

Certaines implémentations, par exemple les systèmes mainframe IBM , prennent en charge les représentations numériques décimales zonées . Chaque chiffre décimal est stocké dans un octet, les quatre bits inférieurs codant le chiffre sous forme BCD. Les quatre bits supérieurs, appelés bits de "zone", sont généralement définis sur une valeur fixe de sorte que l'octet contient une valeur de caractère correspondant au chiffre. Les systèmes EBCDIC utilisent une valeur de zone de 1111 (hex F) ; cela donne des octets dans la plage F0 à F9 (hex), qui sont les codes EBCDIC pour les caractères "0" à "9". De même, les systèmes ASCII utilisent une valeur de zone de 0011 (hex 3), donnant les codes de caractères 30 à 39 (hex).

Pour les valeurs décimales zonées signées, le quartet de zone le plus à droite (le moins significatif) contient le chiffre de signe, qui est le même ensemble de valeurs que celui utilisé pour les nombres décimaux condensés signés (voir ci-dessus). Ainsi, une valeur décimale zonée codée sous forme d'octets hexadécimaux F1 F2 D3 représente la valeur décimale signée −123 :

F1 F2 D3
1  2 −3

Table de conversion décimale zonée EBCDIC

Chiffre BCD Hexadécimal Caractère EBCDIC
0+ C0 A0 E0 F0 { (*)   \ (*) 0
1+ C1 A1 E1 F1 UNE ~ (*)   1
2+ C2 A2 E2 F2 B s S 2
3+ C3 A3 E3 F3 C t T 3
4+ C4 A4 E4 F4 vous U 4
5+ C5 A5 E5 F5 E v V 5
6+ C6 A6 E6 F6 F w W 6
7+ C7 A7 E7 F7 g X X 7
8+ C8 A8 E8 F8 H oui Oui 8
9+ C9 A9 E9 F9 je z Z 9
0− J0 B0     } (*) ^ (*)    
1− D1 B1     J      
2− D2 B2     K      
3− D3 B3     L      
4− D4 B4     M      
5− D5 B5     N      
6− D6 B6     O      
7− D7 B7     P      
8− D8 B8     Q      
9− D9 B9     R      

(*) Remarque : ces caractères varient en fonction du réglage de la page de codes de caractères locale .

Décimal zoné à virgule fixe

Certains langages (tels que COBOL et PL/I) prennent directement en charge les valeurs décimales zonées à virgule fixe, attribuant une virgule décimale implicite à un endroit entre les chiffres décimaux d'un nombre. Par exemple, étant donné une valeur décimale zonée signée de six octets avec un point décimal implicite à droite du quatrième chiffre, les octets hexadécimaux F1 F2 F7 F9 F5 C0 représentent la valeur +1 279,50 :

F1 F2 F7 F9 F5 C0
1  2  7  9. 5 +0

BCD dans les ordinateurs

IBM

IBM a utilisé les termes Binary-Coded Decimal Interchange Code (BCDIC, parfois simplement appelé BCD), pour les codes alphanumériques à 6 bits qui représentaient des nombres, des lettres majuscules et des caractères spéciaux. Certaines variantes de BCDIC alphamerics sont utilisées dans la plupart des premiers ordinateurs IBM, y compris l' IBM 1620 (introduit en 1959), la série IBM 1400 et les membres de l' architecture non décimale de la série IBM 700/7000 .

La série IBM 1400 sont des machines adressables par caractères, chaque emplacement étant composé de six bits étiquetés B, A, 8, 4, 2 et 1, plus un bit de contrôle de parité impaire ( C ) et un bit de marque de mot ( M ). Pour le codage des chiffres 1 à 9 , B et A sont zéro et la valeur numérique représentée par le BCD standard à 4 bits dans les bits 8 à 1 . Pour la plupart des autres caractères, les bits B et A sont simplement dérivés des "perforations de zone" "12", "11" et "0" dans le code de caractère de la carte perforée , et les bits 8 à 1 des perforations 1 à 9 . Un ensemble de poinçons "12 zones" à la fois B et A , un ensemble "11 zones" B , et un ensemble "0 zone" (un poinçon 0 combiné avec d'autres) ensemble A . Ainsi la lettre A , qui est (12,1) au format carte perforée, est codée (B,A,1) . Le symbole monétaire $ , (11,8,3) dans la carte perforée, a été codé en mémoire sous la forme (B,8,2,1) . Cela permet aux circuits de convertir entre le format de carte perforée et le format de stockage interne pour être très simple avec seulement quelques cas particuliers. Un cas particulier important est le chiffre 0 , représenté par un seul pointage 0 dans la carte, et (8,2) dans la mémoire centrale.

La mémoire de l'IBM 1620 est organisée en chiffres adressables à 6 bits, les habituels 8, 4, 2, 1 plus F , utilisés comme bit indicateur et C , un bit de contrôle de parité impair. Les caractères alphabétiques BCD sont codés à l'aide de paires de chiffres, avec la "zone" dans le chiffre pair et le "chiffre" dans le chiffre impair, la "zone" étant liée aux "poinçons de zone" 12 , 11 et 0 comme dans la série 1400. Matériel de traduction d'entrée/sortie converti entre les paires de chiffres internes et les codes BCD 6 bits standard externes.

Dans l'architecture décimale IBM 7070 , IBM 7072 et IBM 7074 alphamerics sont codés à l'aide de paires de chiffres (en utilisant le code deux sur cinq dans les chiffres, pas BCD) du mot à 10 chiffres, avec la "zone" dans le chiffre de gauche et le "chiffre" dans le chiffre de droite. Matériel de traduction d'entrée/sortie converti entre les paires de chiffres internes et les codes BCD 6 bits standard externes.

Avec l'introduction de System/360 , IBM a étendu les caractères alphamétiques BCD 6 bits à EBCDIC 8 bits, permettant l'ajout de beaucoup plus de caractères (par exemple, des lettres minuscules). Un type de données numériques BCD compacté de longueur variable est également implémenté, fournissant des instructions machine qui effectuent l'arithmétique directement sur les données décimales compactées.

Sur les IBM 1130 et 1800 , le BCD compressé est pris en charge dans le logiciel par le Commercial Subroutine Package d'IBM.

Aujourd'hui, les données BCD sont encore largement utilisées dans les processeurs et les bases de données IBM , tels que IBM DB2 , les mainframes et Power6 . Dans ces produits, le BCD est généralement zoné BCD (comme dans EBCDIC ou ASCII), Packed BCD (deux chiffres décimaux par octet) ou encodage BCD "pur" (un chiffre décimal stocké en BCD dans les quatre bits inférieurs de chaque octet) . Tous ces éléments sont utilisés dans les registres matériels et les unités de traitement, ainsi que dans les logiciels. Pour convertir les décimales condensées dans les déchargements de table EBCDIC en nombres lisibles, vous pouvez utiliser le masque OUTREC FIELDS de l'utilitaire JCL DFSORT.

D'autres ordinateurs

La série VAX-11 de Digital Equipment Corporation comprend des instructions qui peuvent effectuer des opérations arithmétiques directement sur les données BCD compressées et effectuer une conversion entre les données BCD compressées et d'autres représentations entières. Le format BCD compressé du VAX est compatible avec celui d'IBM System/360 et des processeurs compatibles plus récents d'IBM. Les implémentations de MicroVAX et de VAX ultérieures ont supprimé cette capacité du processeur mais ont conservé la compatibilité du code avec les machines antérieures en implémentant les instructions manquantes dans une bibliothèque logicielle fournie par le système d'exploitation. Ceci est invoqué automatiquement via la gestion des exceptions lorsque les instructions défuntes sont rencontrées, afin que les programmes les utilisant puissent s'exécuter sans modification sur les machines les plus récentes.

L' architecture Intel x86 prend en charge un format BCD unique à 18 chiffres (dix octets) qui peut être chargé et stocké à partir des registres à virgule flottante, à partir desquels les calculs peuvent être effectués.

La série Motorola 68000 avait des instructions BCD.

Dans les ordinateurs plus récents, ces capacités sont presque toujours implémentées dans le logiciel plutôt que dans le jeu d'instructions du processeur, mais les données numériques BCD sont encore extrêmement courantes dans les applications commerciales et financières. Il existe des astuces pour implémenter des opérations d'addition ou de soustraction décimales condensées et zonées en utilisant des séquences courtes mais difficiles à comprendre de logique parallèle aux mots et d'opérations arithmétiques binaires. Par exemple, le code suivant (écrit en C ) calcule une addition BCD condensée non signée à 8 chiffres à l'aide d'opérations binaires 32 bits :

uint32_t BCDadd(uint32_t a, uint32_t b)
{
    uint32_t t1, t2;    // unsigned 32-bit intermediate values

    t1 = a + 0x06666666;
    t2 = t1 ^ b;                   // sum without carry propagation
    t1 = t1 + b;                   // provisional sum
    t2 = t1 ^ t2;                  // all the binary carry bits
    t2 = ~t2 & 0x11111110;         // just the BCD carry bits
    t2 = (t2 >> 2) | (t2 >> 3);    // correction
    return t1 - t2;                // corrected BCD sum
}

BCD en électronique

Le BCD est très courant dans les systèmes électroniques où une valeur numérique doit être affichée, en particulier dans les systèmes constitués uniquement de logique numérique et ne contenant pas de microprocesseur. En utilisant le BCD, la manipulation des données numériques pour l'affichage peut être grandement simplifiée en traitant chaque chiffre comme un sous-circuit unique séparé. Cela correspond beaucoup plus à la réalité physique du matériel d'affichage - un concepteur peut choisir d'utiliser une série d' écrans distincts identiques à sept segments pour construire un circuit de mesure, par exemple. Si la quantité numérique était stockée et manipulée sous forme binaire pure, l'interfaçage avec un tel affichage nécessiterait des circuits complexes. Par conséquent, dans les cas où les calculs sont relativement simples, travailler avec BCD peut conduire à un système global plus simple que la conversion vers et depuis le binaire. La plupart des calculatrices de poche effectuent tous leurs calculs en BCD.

Le même argument s'applique lorsque le matériel de ce type utilise un microcontrôleur intégré ou un autre petit processeur. Souvent, la représentation de nombres en interne au format BCD se traduit par un code plus petit, car une conversion depuis ou vers une représentation binaire peut être coûteuse sur des processeurs aussi limités. Pour ces applications, certains petits processeurs disposent de modes arithmétiques dédiés, qui facilitent l'écriture de routines qui manipulent les quantités BCD.

Opérations avec BCD

Une addition

Il est possible d'effectuer une addition en ajoutant d'abord en binaire, puis en convertissant en BCD par la suite. La conversion de la somme simple de deux chiffres peut être effectuée en ajoutant 6 (c'est-à-dire 16 - 10) lorsque le résultat de cinq bits de l'addition d'une paire de chiffres a une valeur supérieure à 9. La raison de l'ajout de 6 est qu'il y a 16 valeurs BCD 4 bits possibles (puisque 2 4 = 16), mais seulement 10 valeurs sont valides (0000 à 1001). Par exemple:

1001 + 1000 = 10001
   9 +    8 =    17

10001 est la représentation binaire, et non décimale, du résultat souhaité, mais le 1 le plus significatif (le "carry") ne peut pas tenir dans un nombre binaire de 4 bits. En BCD comme en décimal, il ne peut pas exister une valeur supérieure à 9 (1001) par chiffre. Pour corriger cela, 6 (0110) est ajouté au total, puis le résultat est traité comme deux grignotages :

10001 + 0110 = 00010111 => 0001 0111
   17 +    6 =       23       1    7

Les deux quartets du résultat, 0001 et 0111, correspondent aux chiffres "1" et "7". Cela donne "17" en BCD, ce qui est le résultat correct.

Cette technique peut être étendue à l'ajout de plusieurs chiffres en ajoutant des groupes de droite à gauche, en propageant le deuxième chiffre en tant que retenue, en comparant toujours le résultat de 5 bits de chaque somme de paire de chiffres à 9. Certains processeurs fournissent un indicateur de demi-portée. pour faciliter les ajustements arithmétiques BCD à la suite d'opérations d'addition et de soustraction binaires. Le processeur Z80 fournit l'opcode DAA, l'accumulateur de réglage décimal, DAA

Soustraction

Soustraction se fait en ajoutant le complément dix des soustractif au diminuende . Pour représenter le signe d'un nombre en BCD, le nombre 0000 est utilisé pour représenter un nombre positif et 1001 est utilisé pour représenter un nombre négatif . Les 14 combinaisons restantes sont des signes invalides. Pour illustrer la soustraction BCD signée, considérons le problème suivant : 357 − 432.

En BCD signé, 357 est 0000 0011 0101 0111. Le complément à dix de 432 peut être obtenu en prenant le complément à neuf de 432, puis en ajoutant un. Ainsi, 999 − 432 = 567 et 567 + 1 = 568. En précédant 568 en BCD par le code de signe négatif, le nombre −432 peut être représenté. Ainsi, -432 en BCD signé est 1001 0101 0110 1000.

Maintenant que les deux nombres sont représentés en BCD signé, ils peuvent être additionnés :

  0000 0011 0101 0111
  0    3    5    7
+ 1001 0101 0110 1000
  9    5    6    8
= 1001 1000 1011 1111
  9    8    11   15

Étant donné que BCD est une forme de représentation décimale, plusieurs des sommes de chiffres ci-dessus sont invalides. Dans le cas où une entrée invalide (tout chiffre BCD supérieur à 1001) existe, 6 est ajouté pour générer un bit de retenue et faire en sorte que la somme devienne une entrée valide. Ainsi, l'ajout de 6 aux entrées invalides donne les résultats suivants :

  1001 1000 1011 1111
  9    8    11   15
+ 0000 0000 0110 0110
  0    0    6    6
= 1001 1001 0010 0101
  9    9    2    5

Ainsi le résultat de la soustraction est 1001 1001 0010 0101 (−925). Pour confirmer le résultat, notez que le premier chiffre est 9, ce qui signifie négatif. Cela semble être correct, puisque 357 − 432 devrait donner un nombre négatif. Les grignotages restants sont BCD, donc 1001 0010 0101 est 925. Le complément à dix de 925 est 1000 − 925 = 75, donc la réponse calculée est −75.

S'il y a un nombre différent de grignotages additionnés (comme 1053 - 2), le nombre avec le moins de chiffres doit d'abord être précédé de zéros avant de prendre le complément à dix ou la soustraction. Ainsi, avec 1053 − 2, 2 devrait d'abord être représenté par 0002 en BCD, et le complément à dix de 0002 devrait être calculé.

Comparaison avec le binaire pur

Avantages

  • De nombreuses valeurs non intégrales, telles que la décimale 0,2, ont une représentation de valeur de position infinie en binaire (.001100110011...) mais ont une valeur de position finie en décimale codée binaire (0.0010). Par conséquent, un système basé sur des représentations décimales codées binaires de fractions décimales évite les erreurs de représentation et de calcul de telles valeurs. Ceci est utile dans les calculs financiers.
  • La mise à l'échelle par une puissance de 10 est simple.
  • L'arrondi à une limite décimale est plus simple. L'addition et la soustraction en décimales ne nécessitent pas d'arrondi.
  • L'alignement de deux nombres décimaux (par exemple 1,3 + 27,08) est un décalage simple et exact.
  • La conversion vers une forme de caractère ou pour l'affichage (par exemple, vers un format basé sur du texte tel que XML , ou pour piloter des signaux pour un affichage à sept segments ) est un mappage simple par chiffre, et peut être effectué en linéaire ( O ( n )) temps. La conversion à partir d'un binaire pur implique une logique relativement complexe qui s'étend sur des chiffres, et pour les grands nombres, aucun algorithme de conversion en temps linéaire n'est connu (voir Système de numération binaire § Conversion vers et depuis d'autres systèmes de numération ).

Désavantages

  • Certaines opérations sont plus complexes à mettre en œuvre. Les additionneurs nécessitent une logique supplémentaire pour les amener à s'enrouler et à générer un report plus tôt. 15 à 20 % de circuits supplémentaires sont nécessaires pour l'ajout BCD par rapport au binaire pur. La multiplication nécessite l'utilisation d'algorithmes un peu plus complexes que shift-mask-add (une multiplication binaire , nécessitant des décalages et des additions binaires ou l'équivalent, par chiffre ou groupe de chiffres est requise).
  • Le BCD standard nécessite quatre bits par chiffre, soit environ 20 % d'espace en plus qu'un codage binaire (le rapport de 4 bits sur log 2 10 bits est de 1,204). Lorsqu'il est emballé de manière à ce que trois chiffres soient codés sur dix bits, la surcharge de stockage est considérablement réduite, au détriment d'un codage qui n'est pas aligné avec les limites d'octets de 8 bits communes sur le matériel existant, ce qui entraîne des implémentations plus lentes sur ces systèmes.
  • Les implémentations pratiques existantes de BCD sont généralement plus lentes que les opérations sur les représentations binaires, en particulier sur les systèmes embarqués, en raison de la prise en charge limitée du processeur pour les opérations BCD natives.

Variations de représentation

Diverses implémentations BCD existent qui emploient d'autres représentations pour les nombres. Les calculatrices programmables fabriquées par Texas Instruments , Hewlett-Packard et d'autres utilisent généralement un format BCD à virgule flottante , généralement avec deux ou trois chiffres pour l'exposant (décimal). Les bits supplémentaires du chiffre de signe peuvent être utilisés pour indiquer des valeurs numériques spéciales, telles que infinity , underflow / overflow , et error (un affichage clignotant).

Variantes signées

Les valeurs décimales signées peuvent être représentées de plusieurs manières. Le langage de programmation COBOL , par exemple, prend en charge cinq formats décimaux zonés, chacun codant le signe numérique d'une manière différente :

Taper La description Exemple
Non signé Aucun signe de grignotage F1 F2 F3
Fin signé (format canonique) Signez le grignotage dans le dernier octet (le moins significatif) F1 F2 C3
Signé en tête (overpunch) Signez le grignotage dans le premier octet (le plus significatif) C1 F2 F3
Signé à la fin séparément Octet de caractère de signe séparé ( '+'ou '−') suivant les octets de chiffre F1 F2 F3 2B
Signé à part Octet de caractère de signe séparé ( '+'ou '−') précédant les octets de chiffre 2B F1 F2 F3

Décimal codé binaire (TBCD) de téléphonie

Le 3GPP a développé TBCD , une extension de BCD où les combinaisons de bits restantes (inutilisées) sont utilisées pour ajouter des caractères téléphoniques spécifiques , avec des chiffres similaires à ceux trouvés dans la conception originale des claviers téléphoniques .

décimal
chiffres
À déterminer
8 4 2 1
* 1 0 1 0
# 1 0 1 1
une 1100
b 1 1 0 1
c 1 1 1 0
Utilisé comme remplissage lorsqu'il y a un nombre impair de chiffres 1 1 1 1

Le document 3GPP mentionné définit TBCD-STRING avec des quartets échangés dans chaque octet. Bits, octets et chiffres indexés à partir de 1, bits à droite, chiffres et octets à gauche.

bits 8765 de l'octet n chiffre de codage 2 n

bits 4321 de l'octet n chiffre de codage 2( n – 1) + 1

Signification nombre 1234, deviendrait 21 43dans TBCD.

Encodages alternatifs

Si les erreurs de représentation et de calcul sont plus importantes que la vitesse de conversion vers et depuis l'affichage, une représentation binaire mise à l'échelle peut être utilisée, qui stocke un nombre décimal sous la forme d'un entier codé en binaire et d'un exposant décimal signé codé en binaire. Par exemple, 0,2 peut être représenté par 2 × 10 1 .

Cette représentation permet une multiplication et une division rapides, mais peut nécessiter un décalage d'une puissance de 10 lors de l'addition et de la soustraction pour aligner les points décimaux. Il convient aux applications avec un nombre fixe de décimales qui ne nécessitent pas alors cet ajustement, en particulier les applications financières où 2 ou 4 chiffres après la virgule suffisent généralement. En effet, il s'agit presque d'une forme d' arithmétique à virgule fixe puisque la position du point de base est implicite.

Les codages Hertz et Chen-Ho fournissent des transformations booléennes pour convertir des groupes de trois chiffres codés BCD vers et à partir de valeurs 10 bits qui peuvent être efficacement codées dans le matériel avec seulement 2 ou 3 délais de porte. Décimale dense (DPD) est un système similaire qui est utilisé pour la plupart de la mantisse , à l' exception du chiffre de plomb, pour l' un des deux codages décimales alternatives spécifiées dans la norme IEEE 754-2008 type à virgule flottante.

Application

Le BIOS de nombreux ordinateurs personnels stocke la date et l'heure en BCD car la puce d'horloge en temps réel MC6818 utilisée dans la carte mère IBM PC AT d'origine fournissait l'heure codée en BCD. Ce formulaire est facilement converti en ASCII pour l'affichage.

La famille d'ordinateurs Atari 8 bits utilisait le BCD pour implémenter des algorithmes à virgule flottante. Le processeur MOS 6502 dispose d'un mode BCD qui affecte les instructions d'addition et de soustraction. Le logiciel fourni par le fabricant de l'ordinateur de poche Psion Organizer 1 utilisait également entièrement le BCD pour implémenter la virgule flottante ; plus tard, les modèles Psion utilisaient exclusivement le binaire.

Les premiers modèles de la PlayStation 3 stockent la date et l'heure en BCD. Cela a conduit à une panne mondiale de la console le 1er mars 2010. Les deux derniers chiffres de l'année stockés en tant que BCD ont été interprétés à tort comme 16 provoquant une erreur dans la date de l'unité, rendant la plupart des fonctions inopérantes. C'est ce qu'on a appelé le problème de l' année 2010 .

Histoire juridique

Dans l'affaire Gottschalk c. Benson en 1972 , la Cour suprême des États-Unis a annulé la décision d'un tribunal inférieur qui avait autorisé un brevet pour la conversion de nombres codés en BCD en binaire sur un ordinateur. La décision a noté qu'un brevet « prévaudrait entièrement sur la formule mathématique et, dans la pratique, serait un brevet sur l' algorithme lui-même ». Il s'agissait d'un jugement historique déterminant la brevetabilité des logiciels et des algorithmes.

Voir également

Remarques

Les références

Lectures complémentaires

Liens externes