Question

Je sais BCD est comme la plus intuitive de type de données si vous ne savez pas binaire.Mais je ne sais pas pourquoi utiliser ce codage, l'un de ses semblables n'a pas fait beaucoup de sens depuis ses déchets représentation en 4bits (lorsque la représentation est plus grand que 9).

Aussi, je pense x86 prend uniquement en charge les ajoute et subs directement (vous pouvez les convertir via FPU).

Il est possible que cela vient de machines anciennes, ou d'autres architectures?

Merci!

Était-ce utile?

La solution

Je pense que BCD est utile pour beaucoup de choses, les raisons ci-dessus. Une chose qui est en quelque sorte évidente qui semble avoir été négligée est de fournir une instruction pour passer du binaire au BCD et le contraire. Cela pourrait être très utile pour convertir un numéro ASCII en binaire pour l'arithmatique.

L'une des affiches était erronée sur les nombres stockés souvent en ASCII, en fait, beaucoup de stockage de nombres binaires sont effectués parce que c'est plus efficace. Et la conversion de l'ASCII en binaire est un peu compliquée. BCD est en quelque sorte entre ASCII et binaire, s'il y avait des instructions BSDToint et InttOBCD, cela rendrait les conversions comme telles vraiment faciles. Toutes les valeurs ASCII doivent être converties en binaire pour l'arithmatique. Ainsi, le BCD est en fait utile en ce que l'ASCII à la conversion binaire.

Autres conseils

L'arithmétique BCD est utile pour les calculs décimaux exacts, ce qui est souvent une exigence pour les applications financières, la comptabilité, etc. Il facilite également la multiplication / la division par des pouvoirs de 10. De nos jours, il existe de meilleures alternatives.

Il y a un bon Article Wikipedia qui traite du pro et des inconvénients.

BCD est utile à l'extrémité très bas du spectre électronique, lorsque la valeur d'un registre est affichée par un dispositif de sortie. Par exemple, disons que vous avez une calculatrice avec un certain nombre d'affichages à sept segments qui affichent un nombre. Il est pratique si chaque affichage est contrôlé par des bits séparés.

Il peut sembler invraisemblable qu'un processeur x86 moderne soit utilisé dans un appareil avec ce type d'affichages, mais x86 remonte à un long Way, et l'ISA maintient beaucoup de compatibilité en arrière.

BCD est un gaspillage spatial, c'est vrai, mais il a l'avantage d'être un Format "Pitch Fixe", ce qui facilite la recherche du nième chiffre dans un nombre particulier.

Un autre avantage est que cela permet calculs arithmétiques exacts sur les numéros de taille arbitraire. De plus, en utilisant les caractéristiques de la «hauteur fixe» mentionnées, ces opérations arithmétiques peuvent facilement être chantées en plusieurs threads (traitement parallèle).

BCD existe dans moderne de CPU x86 depuis, il a été à l'origine, processeur 8086, et tous les CPU x86 sont 8086 compatible.BCD opérations en x86 ont été utilisés pour soutenir des applications d'affaires à l'époque.BCD de soutien dans le processeur lui-même n'est pas vraiment plus utilisées.

Notez que BCD est une représentation exacte des nombres décimaux, qui à virgule flottante n'est pas, et que la mise en œuvre de BCD dans le matériel est beaucoup plus simple que de l'implémentation en virgule flottante.Ce genre de choses qui importait le plus en arrière lorsque les transformateurs avaient moins d'un million de transistors, qui a couru à quelques mégahertz.

De nos jours, il est courant de stocker les nombres au format binaire et de les convertir en format décimal à des fins d'affichage, mais la conversion prend un certain temps. Si l'objectif principal d'un nombre doit être affiché ou pour être ajouté à un nombre qui sera affiché, il peut être plus pratique d'effectuer des calculs au format décimal que d'effectuer des calculs en binaire et de convertir en décimal. De nombreux appareils avec des lectures numériques et de nombreux jeux vidéo ont stocké des numéros au format BCD emballé, qui stocke deux chiffres par octet. C'est pourquoi de nombreux compteurs de score débordent à 1 000 000 points plutôt qu'une valeur de puissance de deux. Si le matériel ne facilite pas l'arithmétique BCD emballée, l'alternative ne serait pas d'utiliser le binaire, mais d'utiliser une décimale déballée. La conversion du BCD emballé en décimal déballé en ce moment qu'il est affiché peut facilement être fait un chiffre à la fois. Convertir le binaire en décimal, en revanche, est beaucoup plus lent et nécessite de fonctionner sur toute la quantité.

Soit dit en passant, l'ensemble d'instructions 8086 est le seul que j'ai vu avec des instructions pour "ASCII ADG pour la division" et "ASCII ADG pour la multiplication", dont l'un multiplie un octet par dix et l'autre qui divise par dix. Curieusement, la valeur "0a" fait partie des instructions de la machine, et la substitution d'un nombre différent entraînera une multiplication ou une division de ces instructions, mais les instructions ne sont pas documentées comme étant des instructions de multiplication générale / division par constante . Je me demande pourquoi cette fonctionnalité n'a pas été documentée, étant donné qu'elle aurait pu être utile?

Il est également intéressant de noter la variété des approches des processeurs utilisés pour ajouter ou soustraire BCD emballé. Beaucoup effectuent un ajout binaire, mais utilisent un drapeau pour garder une trace de savoir si un transport s'est produit du bit 3 au bit 4 pendant un ajout; Ils peuvent alors s'attendre à ce que le code nettoie le résultat (par exemple PIC), fournit un opcode pour nettoyer l'addition mais pas la soustraction, fournir un opcode pour nettoyer l'addition et un autre pour la soustraction (par exemple x86), ou utiliser un drapeau pour suivre si le dernier Le fonctionnement était l'ajout ou la soustraction et utiliser le même opcode pour nettoyer les deux (par exemple Z80). Certains utilisent des opcodes séparés pour l'arithmétique BCD (par exemple 68000), et certains utilisent un drapeau pour indiquer si les opérations ADD / Soustraire doivent utiliser des dérivés binaires ou BCD (par exemple 6502). Fait intéressant, le 6502 d'origine effectue des mathématiques BCD à la même vitesse que les mathématiques binaires, mais les dérivés CMOS de celui-ci nécessitent un cycle supplémentaire pour les opérations BCD.

Je suis sûr que l'article Wiki lié au précédent va plus en détail, mais j'ai utilisé BCD sur la programmation Mainframe IBM (en PL / I). BCD a non seulement garanti que vous pouvez regarder des zones particulières d'un octet pour trouver un chiffre individuel - ce qui est parfois utile - mais a également permis au matériel d'appliquer des règles simples pour calculer la précision et l'échelle requises pour ajouter ou multiplier deux nombres ensemble.

Si je me souviens bien, on m'a dit que sur les mainframes, la prise en charge de BCD a été implémentée dans le matériel et à ce moment-là, était notre seule option pour représenter des numéros de points flottants. (Nous parlons 18 ans, allez ici!)

Quand j'étais à l'université il y a plus de 30 ans, on m'a dit que les raisons pour lesquelles BCD (comp-3 dans COBOL) était un bon format.

Aucune de ces raisons n'est toujours pertinente avec le matériel moderne. Nous avons une arithmétique à point fixe binaire rapide. Nous n'avons plus besoin de pouvoir convertir BCD en un format affiché en ajoutant un décalage à chaque chiffre BCD. Nous stockons rarement les numéros à huit bits par chiffre, donc le fait que BCD ne prenne que quatre bits par chiffre n'est pas très intéressant.

Le BCD est une relique et doit être laissé dans le passé, où il appartient.

Très peu d'humains peuvent dimensionner les montants exprimés en Hexa, il est donc utile de montrer ou du moins de permettre de visualiser l'intermédiaire en décimal. Spécialement dans le monde financier ou comptable.

L'informatique moderne a mis l'accent sur le codage qui capture la logique de conception plutôt que d'optimiser quelques cycles CPU ici ou là. La valeur du temps et / ou de la mémoire enregistrée ne vaut souvent pas la peine d'écrire des routines spéciales au niveau du bit.

Cela étant dit, BCD est encore parfois utile.

Le seul exemple auquel je peux penser est lorsque vous avez une énorme base de données FlatFiles ou d'autres Big Data qui se trouvent dans un format ASCII comme CSV. Le BCD est génial si tout ce que vous faites est de rechercher de la valeur entre certaines limites. Pour convertir toutes les valeurs pendant que vous numérisez toutes ces données augmenteraient considérablement le temps de traitement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top