← Zurück zum BlogZahlensysteme

BCD (binär codierte Dezimalzahl): Grundlagen erklärt

BCD codiert jede Dezimalziffer mit 4 Bit. Lernen Sie gepackte und ungepackte Formen, die +6-Korrektur bei der Addition, Dezimalskalierung und praktische Abwägungen kennen.

DennyDenny
7 Min. Lesezeit
Chalkboard feature illustration for “BCD (binär codierte Dezimalzahl): Grundlagen erklärt”

Kurz gesagt: Binär codierte Dezimalzahlen (BCD) speichern jede Dezimalziffer 0–9 in einem 4-Bit-Nibble; die Muster 1010–1111 bleiben ungenutzt. Ein BCD-Ziffernaddierer führt eine +6-Korrektur aus, wenn die rohe Binärsumme größer als 9 ist oder einen Übertrag erzeugt. BCD bewahrt gespeicherte Dezimalziffern exakt, doch Division und Skalierung mit endlicher Genauigkeit brauchen weiterhin ausdrücklich festgelegte Rundungsregeln.

Binär- und Dezimalzahlen verwenden in ihren Stellenwerten unterschiedliche Primfaktoren. Deshalb besitzen viele endliche Dezimalbrüche – darunter 0,1 – keine endliche Binärdarstellung. Binär codierte Dezimalzahlen speichern die Dezimalziffern direkt. Damit entfällt der anfängliche Darstellungsfehler eines Binärbruchs; eine robuste Anwendung muss für Ergebnisse, die mehr Stellen als das Format aufnehmen können, aber trotzdem Skalierung, Genauigkeit und Rundung definieren.

Was ist Binary-Coded Decimal?

BCD stellt jede Dezimalziffer von 0 bis 9 mit einem eigenen 4-Bit-Binärcode dar. Vier Bit können 16 Muster codieren, BCD verwendet jedoch nur die ersten zehn:

DezimalBCD-Nibble
00000
10001
20010
30011
40100
50101
60110
70111
81000
91001

Die sechs übrigen Muster 1010 bis 1111 – in reinem Binär also die Werte 10 bis 15 – sind in BCD ungültig. Ein Schaltkreis, der eines dieser Muster erzeugt, hat entweder eine Ziffer überlaufen lassen oder eine fehlerhafte Eingabe erhalten; BCD-Addierer müssen diesen Fall erkennen und korrigieren.

Eine mehrstellige Dezimalzahl wird durch Aneinanderreihen von Nibbles codiert. Die Zahl 327 wird beispielsweise so dargestellt:

32710  =  0011⏟3  0010⏟2  0111⏟7327_{10} \;=\; \underbrace{0011}_{3}\;\underbrace{0010}_{2}\;\underbrace{0111}_{7}

Zum Vergleich benötigt die reine Binärdarstellung 32710=1010001112327_{10}=101000111_2 nur 9 statt 12 Bit. BCD benötigt zusätzliche Bit, bewahrt dafür eine ziffernorientierte Darstellung und vereinfacht manche Dezimalschnittstellen.

Gepacktes und ungepacktes BCD

Es gibt zwei verbreitete Speicherlayouts.

Ungepacktes BCD speichert eine Dezimalziffer pro Byte. Das Low-Nibble enthält die Ziffer; im High-Nibble steht entweder null oder ein ASCII-artiges Kennzeichen (0x30 bei frühen IBM- und x86-BCD-Befehlen, wodurch direkt das druckbare ASCII-Zeichen entsteht). Ungepacktes BCD verschwendet die Hälfte des Speichers, lässt sich aber sehr einfach ausgeben.

Gepacktes BCD speichert zwei Dezimalziffern pro Byte, je eine in jedem Nibble. Die Zahl 327 benötigt im gepackten BCD zwei Byte: 0x03 0x27. Gepacktes BCD ist doppelt so dicht und wird in BCD-Addierern sowie den x86-Befehlen DAA/DAS verwendet.

FormatZiffer 327ByteDichte
Ungepackt0x03 0x02 0x0731 Ziffer/Byte
Gepackt0x03 0x2722 Ziffern/Byte
Reines Binär (16 Bit)0x01 0x472voller Bereich

Für Werte bis 65.535 erreicht reines Binär dieselbe Byte-Dichte wie gepacktes BCD, codiert aber 65.536 verschiedene Werte statt 10.000. Der Nachteil zeigt sich erst wieder, wenn die Arithmetik exakt dem Dezimalergebnis entsprechen muss.

Warum gibt es BCD überhaupt?

Wenn Binär kompakter ist, warum BCD verwenden? Drei Gründe halten es lebendig.

Exakt gespeicherte Dezimalziffern. Der Dezimalbruch 0,1 hat keine endliche Binärdarstellung. BCD kann 0.1 exakt speichern, wenn die Position des Dezimalpunkts Teil des Formats ist. Arithmetik bleibt nur so lange exakt, wie Ergebnis, Stellenzahl und Skalierung passen; Division und andere nicht abbrechende Ergebnisse benötigen Rundung. Der Beitrag zu IEEE-754-Gleitkommazahlen behandelt die binäre Seite dieses Kompromisses.

Einfache Anzeigeumwandlung. Eine Digitaluhr oder ein Taschenrechner steuert die 7-Segment-Anzeige für jedes BCD-Nibble über einen kleinen Decoder an. Es gibt keine Division durch 10 und keine Schleife mit wiederholten Subtraktionen. Derselbe Vorteil motiviert den BCD-zu-7-Segment-Decoder im Folgebeitrag.

Dezimale Geschäftsregeln. Finanz- und Messanwendungen schreiben häufig Dezimalskalierung und Rundung vor. Gepackte Dezimalzahlen, COBOL COMP-3, dezimale Gleitkommazahlen und skalierte Binärzahlen sind allesamt mögliche Darstellungen. BCD eignet sich, wenn Ziffernspeicher oder Schnittstellen wichtig sind; Vorschriften verlangen nicht allgemein BCD.

BCD-Ziffern addieren: die +6-Korrektur

BCD-Addition verwendet gewöhnliche 4-Bit-Binäraddierer – siehe den Beitrag zum 4-Bit-Ripple-Carry-Addierer – und danach eine Dezimalanpassung, die Ergebnisse größer als 9 korrigiert.

Die Regel ist einfach:

  • Ist die Binärsumme kleiner oder gleich 9 und gab es keinen Übertrag, bleibt die BCD-Summe unverändert.
  • Ist die Summe größer als 9 oder gab es einen Übertrag aus dem 4-Bit-Addierer, wird zur Korrektur 6 (0110) addiert und ein Übertrag an die nächste Ziffer weitergegeben.

Warum 6? BCD überspringt die sechs ungültigen Muster 1010–1111. Jede Binärsumme in diesem Bereich liegt in der BCD-Nummerierung genau sechs Positionen zu weit vorne; das Addieren von 6 lässt sie zurückspringen und erzeugt den von der Dezimalarithmetik erwarteten Übertrag.

Beispiel: 7 + 5

Operanden codieren und als 4-Bit-Binärzahlen addieren:

7=01115=010112=1100\begin{aligned} 7 &= 0111 \\ 5 &= 0101 \\ \hline 12 &= 1100 \end{aligned}

1100 ist binär 12 und damit ein ungültiges BCD-Muster. Wir wenden die +6-Korrektur an:

1100  (12)+  0110  (6)1 0010\begin{aligned} 1100 \;(12) \\ +\;0110 \;(6) \\ \hline 1\,0010 \end{aligned}

Das korrigierte Ergebnis 0001 0010 ist BCD für 12: ein Übertrag in die Zehnerstelle und eine 2 in der Einerstelle.

Beispiel: 8 + 9

8=10009=100117=1 0001\begin{aligned} 8 &= 1000 \\ 9 &= 1001 \\ \hline 17 &= 1\,0001 \end{aligned}

Der 4-Bit-Addierer erzeugt 0001 mit Übertrag. Der Übertrag löst die +6-Korrektur aus, obwohl 0001 wie eine gültige BCD-Ziffer aussieht:

0001+  01100111\begin{aligned} 0001 \\ +\;0110 \\ \hline 0111 \end{aligned}

Das Endergebnis 0001 0111 entspricht BCD für 17. Ohne Korrektur würde ein BCD-Decoder den rohen Übertrag und das Low-Nibble als 0001 0001 lesen, also als 11.

Die allgemeine Erkennungsbedingung lautet:

adjust  =  Cout  ∨  (S3∧S2)  ∨  (S3∧S1)\text{adjust} \;=\; C_{\text{out}} \;\lor\; (S_3 \land S_2) \;\lor\; (S_3 \land S_1)

Dabei ist S3S2S1S0S_3 S_2 S_1 S_0 die 4-Bit-Binärsumme. Die beiden UND-Terme decken die sechs ungültigen Muster 1010–1111 ab; CoutC_{\text{out}} erfasst den Fall, dass die Summe bereits über 15 hinaus gewickelt ist.

Hardware: ein einstelliges BCD-Addierwerk

Ein einstelliges BCD-Addierwerk besteht aus zwei 4-Bit-Binäraddierern und einer kleinen Korrekturerkennung:

  A[3:0]  B[3:0]
     |      |
     v      v
 +-----------------+
 |  4-bit adder #1 |  <-- gewöhnliche Binäraddition (siehe /docs/adder)
 +-----------------+
   S[3:0]   C_out
     |        |
     +--+--+--+
        |  |
        v  v
   +----------+
   | detect   |  --> adjust = C_out OR (S3·S2) OR (S3·S1)
   +----------+
        |
        v       0110 bei adjust, sonst 0000
 +-----------------+
 |  4-bit adder #2 |  <-- addiert die Korrektur
 +-----------------+
        |
        v
     BCD-Ergebnis, BCD-Übertrag

Der erste Addierer berechnet die rohe Binärsumme, der Detect-Block das Adjust-Signal. Der zweite Addierer addiert entweder 0 oder 6. Der BCD-Übertrag entspricht dem Adjust-Signal: Sobald 6 addiert werden muss, wird auch eine 1 an die nächste Dezimalziffer weitergegeben. Verkettet man nn solcher Blöcke, erhält man einen nn-stelligen BCD-Ripple-Addierer. Seine Kette folgt derselben Grundidee wie bei Voll- und Halbaddierern, nur mit einer breiteren Ziffer und einer Korrekturstufe. Bauen Sie ihn aus zwei Addierer-Blöcken und der Erkennungslogik und treiben Sie mit dem Ergebnis eine Ziffernanzeige. Beschränken Sie Eingaben auf gültige BCD-Ziffern 0–9; der Korrekturausdruck ist kein allgemeiner Filter für ungültige Nibbles.

BCD-Subtraktion

Bei der Subtraktion verwendet man statt des binären Zweierkomplements das 9er- oder 10er-Komplement. Für A−BA-B:

  1. Bilden Sie das 9er-Komplement von BB, indem Sie jede Ziffer dd durch 9−d9-d ersetzen.
  2. Addieren Sie das Ergebnis als BCD zu AA.
  3. Tritt ein finaler Übertrag auf, addieren Sie 1 (Anpassung zum 10er-Komplement). Der Übertrag zeigt ein positives Ergebnis an.
  4. Ohne Übertrag ist das Ergebnis negativ; bilden Sie erneut das Komplement, um den Betrag zu erhalten.

Das 9er-Komplement erfüllt für Dezimalzahlen dieselbe Funktion wie das Einerkomplement für Binärzahlen, und das 10er-Komplement ist das dezimale Gegenstück zum Zweierkomplement. Die Korrekturstufen des BCD-ALU werden auf der Subtraktionsseite entsprechend weiterverwendet.

Nachteile von BCD

Speicherbedarf. Jede Dezimalziffer kostet 4 Bit; 4 Byte codieren höchstens 99.999.999. Dieselben 32 Bit stellen binär ungefähr 4,29 Milliarden dar – ein etwa 43-fach größerer Bereich.

Mehr Rechenarbeit. Jede Ziffernaddition benötigt Binäraddition, Korrekturerkennung und Korrektur. Ob gepackte Dezimalzahlen, dezimale Gleitkommazahlen oder skalierte Ganzzahlen schneller sind, hängt von ISA, Workload, Bibliothek und Semantik ab.

Keine native Unterstützung für Bruchteile. Das hier beschriebene BCD codiert Ganzzahlen. Für Bruchteile muss die Dezimalstelle per Konvention festgelegt oder auf densely packed decimal beziehungsweise IEEE-754-2008-Dezimalzahlen gewechselt werden. Die Geschichte dieser Codierungen reicht bis zu den frühesten binären Zahlensystemen zurück.

Wo BCD noch lebt

  • Digitaluhren: Stunden, Minuten und Sekunden werden als sechs BCD-Ziffern gespeichert; jede Ziffer steuert über einen Decoder eine 7-Segment-LED.
  • Taschenrechner: Ziffernorientierte Arithmetik vereinfacht Eingabe und Anzeige, auch wenn intern zusätzlich Binärdarstellungen vorkommen.
  • Industrielle Bedienfelder: Da Daumenradschnittstellen BCD direkt ausgeben, können SPS-Eingänge es ohne Umwandlung lesen.
  • Unternehmenssysteme: Gepackte Dezimalunterstützung bleibt für Festkomma-Geschäftsdaten und COBOL-Workloads nützlich.
  • Mess- und Kassengeräte: Dezimalanzeigen und vorgegebene Rundungsregeln machen ziffernorientierte Formate praktisch.

Wenn die Problemwelt natürlich dezimal ist, ist das explizite Codieren der Ziffern oft besser als eine Umwandlung zwischen Basen bei jeder Operation. Dasselbe spricht heute in Geldsoftware für Festkomma-Ganzzahlen, obwohl die CPU intern binär arbeitet.

Im Simulator ausprobieren

Eine gute Übung ist ein einstelliges BCD-Addierwerk:

  1. Verdrahten Sie zwei 4-Bit-Eingangsregister AA und BB mit einem Addierer und zeigen Sie die rohe 5-Bit-Summe an.
  2. Bauen Sie die Erkennung als ODER aus CoutC_{\text{out}}, (S3∧S2)(S_3 \land S_2) und (S3∧S1)(S_3 \land S_1).
  3. Verwenden Sie das Adjust-Signal, um 0110 in einem zweiten Addierer zu schalten.
  4. Führen Sie das korrigierte Low-Nibble einer Ziffernanzeige und den BCD-Übertrag einer zweiten Ziffer zu.
  5. Durchlaufen Sie A=0..9A=0..9 und B=0..9B=0..9. Die Anzeige muss 0–18 auf zwei Stellen zeigen, ohne A–F-Symbole.

Für größere Werte verketten Sie einen zweiten BCD-Addierer. Sein Carry-out wird wie in einer binären Ripple-Kette zum Carry-in des nächsten.

Wie es weitergeht

Ein einstelliges BCD-Addierwerk ist nur nützlich, wenn man es lesen kann. Der nächste Beitrag – BCD-zu-7-Segment-Decoder: Von Zahlen zur Anzeige – leitet die booleschen Segmentausdrücke aus der BCD-Wahrheitstabelle her und zeigt die Verdrahtung einer echten Anzeige, aufbauend auf den zuvor behandelten Decoder-Grundlagen. Für die binäre Seite desselben Problems erklärt der Beitrag zu IEEE-754-Gleitkommazahlen, warum Finanzcode trotzdem häufig Dezimalzahlen wählt.

Öffnen Sie die Vorlage für einen 4-Bit-Binärzähler, speisen Sie damit einen BCD-Addierer und beobachten Sie, wie die Korrektur bei jedem zehnten Tick auslöst.

Machen Sie aus der Idee eine funktionierende Schaltung.