Binärcodierte Dezimalzahl - Binary-coded decimal

Eine binäre Uhr kann LEDs verwenden , um binäre Werte auszudrücken. Bei dieser Uhr zeigt jede LED-Säule eine binär codierte Dezimalzahl der traditionellen sexagesimalen Zeit.

In Computer- und elektronischen Systemen ist Binärkodierte Dezimalzahl ( BCD ) eine Klasse von binären Kodierungen von Dezimalzahlen , bei denen jede Ziffer durch eine feste Anzahl von Bits dargestellt wird , normalerweise vier oder acht. Manchmal werden spezielle Bitmuster für ein Vorzeichen oder andere Hinweise (zB Fehler oder Überlauf) verwendet.

In byteorientierten Systemen (dh den meisten modernen Computern) impliziert der Begriff ungepackte BCD normalerweise ein volles Byte für jede Ziffer (oft mit einem Vorzeichen), während gepackte BCD typischerweise zwei Ziffern innerhalb eines einzelnen Bytes kodiert, indem man sich die Tatsache zunutze macht, dass vier Bits reichen aus, um den Bereich 0 bis 9 darzustellen. Die genaue 4-Bit-Codierung kann jedoch aus technischen Gründen (zB Excess-3 ) variieren .

Die zehn Zustände, die eine BCD-Ziffer darstellen, werden manchmal als Tetraden bezeichnet (denn das Nibble, das normalerweise benötigt wird, um sie zu halten, wird auch als Tetrade bezeichnet), während die unbenutzten, egal -Zustände Pseudo-Tetrade(e)s  [ de ] genannt werden. Pseudo -Dezimal- oder Pseudo-Dezimal-Ziffern .

Der Hauptvorteil von BCD im Vergleich zu binären Positionssystemen ist seine genauere Darstellung und Rundung von Dezimalgrößen sowie seine einfache Umwandlung in herkömmliche, von Menschen lesbare Darstellungen. Seine Hauptnachteile sind eine leichte Zunahme der Komplexität der Schaltungen, die zum Implementieren grundlegender Arithmetik erforderlich sind, sowie eine etwas weniger dichte Speicherung.

BCD wurde in vielen frühen verwendet Dezimalrechner und wird in dem Befehlssatz von Maschinen wie die implementierte IBM System / 360 - Serie und seine Nachkommen, Digital Equipment Corporation ist VAX , die Burroughs B1700 und dem Motorola 68000 -Serien - Prozessoren. BCD an sich ist nicht mehr so ​​weit verbreitet wie in der Vergangenheit und wird nicht mehr in Befehlssätzen neuerer Computer (zB ARM ) implementiert ; x86 unterstützt seine BCD-Anweisungen im Long-Modus nicht mehr. Dezimale Festkomma- und Gleitkommaformate sind jedoch immer noch wichtig und werden weiterhin in der Finanz-, Handels- und Industriedatenverarbeitung verwendet, wo die subtilen Konvertierungs- und Bruchrundungsfehler , die binären Gleitkommadarstellungen inhärent sind, nicht toleriert werden können.

Hintergrund

BCD macht sich die Tatsache zunutze, dass jede beliebige Dezimalzahl durch ein Vier-Bit-Muster dargestellt werden kann. Die offensichtlichste Methode zum Codieren von Ziffern ist Natural BCD (NBCD), bei der jede Dezimalziffer durch ihren entsprechenden 4-Bit-Binärwert dargestellt wird, wie in der folgenden Tabelle gezeigt. Dies wird auch als "8421"-Kodierung bezeichnet.

Dezimalziffer Tarierweste
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

Dieses Schema kann auch als Simple Binary-Coded Decimal ( SBCD ) oder BCD 8421 bezeichnet werden und ist die gebräuchlichste Codierung. Andere sind die sogenannte „4221“- und „7421“-Codierung – benannt nach der verwendeten Gewichtung der Bits – und „ Excess-3 “. Zum Beispiel steht die BCD-Ziffer 6 0110'bin der 8421-Notation 1100'bin 4221 (zwei Kodierungen sind möglich), 0110'bin 7421, während sie in Excess-3 1001'b( ) ist.

4-Bit-BCD-Codes und Pseudo-Tetrades
Bit Gewicht  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 fünfzehn         Kommentar        
4 8 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 Binär
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
Name 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 fünfzehn Dezimal
8 4 2 1 (XS-0) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 fünfzehn
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
Überschuss-3 (XS-3) -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12
Überschuss-6 (XS-6) -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9
Jump-at-2 (2 4 2 1) 0 1             2 3 4 5 6 7 8 9
Jump-at-8 (2 4 2 1) 0 1 2 3 4 5 6 7             8 9
4 2 2 1 (ich) 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    
Weiß (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 10 11 12 13 14 fünfzehn
Magnetband   1 2 3 4 5 6 7 8 9 0          
Paul   1 3 2 6 7 5 4   0     8 9    
Grau 0 1 3 2 7 6 4 5 fünfzehn 14 12 13 8 9 11 10
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 (Watt) 0 1 3 2     4   9 8 6 7     5  
5-zyklisch 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    
Überschuss-3 Grau -3 -2 0 -1 4 3 1 2 12 11 9 10 5 6 8 7
6 3 −2 −1 (I)         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
Lucali 0 fünfzehn 14 1 12 3 2 13 8 7 6 9 4 11 10 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  
Süßkind I   0   1   4 3 2   9   8 5   6 7
Süßkind II   0   1   9   8 4   3 2 5   6 7
  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 fünfzehn

Die folgende Tabelle stellt Dezimalstellen von 0 bis 9 in verschiedenen BCD-Codierungssystemen dar. In den Headern gibt das " " die Gewichtung jedes Bits an. In der fünften Spalte ("BCD 8 4 −2 −1") sind zwei der Gewichte negativ. Sowohl ASCII- als auch EBCDIC-Zeichencodes für die Ziffern, die Beispiele für BCD-Zonen sind, werden ebenfalls angezeigt. 8421

 
Ziffer
Tarierweste
8 4 2 1
Stibitz-  Code oder Excess-3 Aiken-Code oder 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

Da die meisten Computer mit Daten in 8-Bit- Bytes umgehen , können Sie eine der folgenden Methoden verwenden, um eine BCD-Nummer zu codieren:

  • Ungepackt : Jede Dezimalstelle wird in ein Byte codiert, wobei vier Bits die Zahl darstellen und die restlichen Bits keine Bedeutung haben.
  • Gepackt : Zwei Dezimalziffern werden in ein einzelnes Byte kodiert, wobei eine Ziffer im niederwertigsten Halbbyte ( Bit 0 bis 3 ) und die andere Ziffer im höchstwertigen Halbbyte (Bit 4 bis 7) liegt.

Zum Beispiel führt die Codierung der Dezimalzahl 91mit ungepacktem BCD zu dem folgenden binären Muster von zwei Bytes:

Decimal:         9         1
Binary : 0000 1001 0000 0001

In gepacktem BCD würde dieselbe Zahl in ein einzelnes Byte passen:

Decimal:   9    1
Binary: 1001 0001

Daher ist der Zahlenbereich für ein ungepacktes BCD-Byte null bis einschließlich neun, während der Bereich für ein gepacktes BCD-Byte null bis einschließlich neunundneunzig ist.

Um Zahlen darzustellen, die größer als der Bereich eines einzelnen Bytes sind, kann eine beliebige Anzahl zusammenhängender Bytes verwendet werden. Um beispielsweise die Dezimalzahl 12345im gepackten BCD im Big-Endian- Format darzustellen , würde ein Programm wie folgt codieren:

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

Hier wurde das höchstwertige Halbbyte des höchstwertigen Bytes als Null codiert, sodass die Zahl als gespeichert wird 012345(aber Formatierungsroutinen können führende Nullen ersetzen oder entfernen). Gepackte BCD ist bei der Speichernutzung effizienter als nicht gepackte BCD; Die Codierung derselben Zahl (mit der führenden Null) im entpackten Format würde den doppelten Speicherplatz beanspruchen.

Verschiebe- und Maskierungsoperationen werden verwendet, um eine gepackte BCD-Ziffer zu packen oder zu entpacken. Andere bitweise Operationen werden verwendet, um eine Zahl in ihr äquivalentes Bitmuster umzuwandeln oder den Prozess umzukehren.

Verpacktes BCD

In gepacktem BCD (oder einfach gepacktem Dezimal ) repräsentiert jedes der beiden Halbbytes jedes Bytes eine Dezimalziffer. Packed BCD wird mindestens seit den 1960er Jahren verwendet und ist seitdem in der gesamten IBM Mainframe-Hardware implementiert. Die meisten Implementierungen sind Big Endian , dh mit der höherwertigen Ziffer in der oberen Hälfte jedes Bytes und mit dem am weitesten links liegenden Byte (an der niedrigsten Speicheradresse) mit den höchstwertigen Stellen des gepackten Dezimalwerts. Das untere Halbbyte des ganz rechten Bytes wird normalerweise als Vorzeichenflag verwendet, obwohl einigen Darstellungen ohne Vorzeichen ein Vorzeichenflag fehlt. Als Beispiel besteht ein 4-Byte-Wert aus 8 Nibbles, wobei die oberen 7 Nibbles die Ziffern eines 7-stelligen Dezimalwerts speichern und das unterste Nibble das Vorzeichen des dezimalen Integerwerts angibt.

Standardvorzeichenwerte sind 1100 ( hex C) für positiv (+) und 1101 (D) für negativ (−). Diese Konvention stammt aus dem Zonenfeld für EBCDIC- Zeichen und der vorzeichenbehafteten Overpunch- Darstellung. Andere zulässige Zeichen sind 1010 (A) und 1110 (E) für positiv und 1011 (B) für negativ. IBM System/360-Prozessoren verwenden die Vorzeichen 1010 (A) und 1011 (B), wenn das A-Bit im PSW gesetzt ist, für den ASCII-8-Standard, der nie bestanden wurde. Die meisten Implementierungen liefern auch vorzeichenlose BCD-Werte mit einem Vorzeichen-Halbbyte von 1111 (F). ILE RPG verwendet 1111 (F) für positiv und 1101 (D) für negativ. Diese stimmen mit der EBCDIC-Zone für Ziffern ohne Vorzeichenüberdruck überein. Im gepackten BCD wird die Zahl 127 durch 0001 0010 0111 1100 (127C) und –127 durch 0001 0010 0111 1101 (127D) dargestellt. Burroughs-Systeme verwendeten 1101 (D) für negativ, und jeder andere Wert wird als positiver Vorzeichenwert betrachtet (die Prozessoren normalisieren ein positives Vorzeichen auf 1100 (C)).

Sign
Ziffer
Tarierweste
8 4 2 1
Unterschrift Anmerkungen
EIN 1 0 1 0 +  
B 1 0 1 1  
C 1 1 0 0 + Bevorzugt
D 1 1 0 1 Bevorzugt
E 1 1 1 0 +  
F 1 1 1 1 + Ohne Vorzeichen

Egal wie viele Bytes ein Wort breit ist, es gibt immer eine gerade Anzahl von Nibbles, da jedes Byte zwei davon hat. Daher kann ein Wort von n Bytes bis zu (2 n )−1 Dezimalstellen enthalten, was immer eine ungerade Anzahl von Stellen ist. Eine Dezimalzahl mit d Stellen erfordert1/2( d +1) Byte Speicherplatz.

Ein 4-Byte-Wort (32-Bit) kann beispielsweise sieben Dezimalstellen plus ein Vorzeichen enthalten und Werte im Bereich von ±9.9999.999 darstellen. Somit ist die Zahl −1.234.567 7 Stellen breit und ist codiert als:

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

Wie bei Zeichenketten wird das erste Byte der gepackten Dezimalzahl – das mit den zwei höchstwertigen Stellen – normalerweise an der niedrigsten Adresse im Speicher abgelegt, unabhängig von der Endianness der Maschine.

Im Gegensatz dazu kann eine binäre 4-Byte -Zweierkomplement- Ganzzahl Werte von -2.147.483.648 bis +2.147.483.647 darstellen.

Während gepacktes BCD den Speicher nicht optimal nutzt (etwa 20% mehr Speicher als binäre Notation zum Speichern derselben Zahlen verwendet), wird die Umwandlung in ASCII , EBCDIC oder die verschiedenen Kodierungen von Unicode trivial, da keine arithmetischen Operationen erforderlich sind. Die zusätzlichen Speicheranforderungen werden normalerweise durch die Notwendigkeit der Genauigkeit und Kompatibilität mit Taschenrechnern oder Handberechnungen ausgeglichen, die die Festkomma-Dezimalarithmetik bietet. Dichtere Packungen von BCD existieren, die den Speichernachteil vermeiden und auch keine arithmetischen Operationen für übliche Konvertierungen benötigen.

Gepacktes BCD wird in der Programmiersprache COBOL als Datentyp "COMPUTATIONAL-3" (eine IBM-Erweiterung, die von vielen anderen Compiler-Herstellern übernommen wurde) oder "PACKED-DECIMAL" (Teil des COBOL-Standards von 1985) unterstützt. Es wird in PL/I als "FIXED DECIMAL" unterstützt. Neben dem IBM System/360 und späteren kompatiblen Mainframes ist gepacktes BCD im nativen Befehlssatz der ursprünglichen VAX- Prozessoren der Digital Equipment Corporation und einiger Modelle der Mainframes der SDS-Sigma-Serie implementiert und ist das native Format für die Burroughs Corporation Medium Systems Reihe von Großrechnern (abgeleitet von der Electrodata 200-Serie aus den 1950er Jahren ).

Zehnerkomplementdarstellungen für negative Zahlen bieten einen alternativen Ansatz zum Codieren des Vorzeichens von gepackten (und anderen) BCD-Zahlen. In diesem Fall haben positive Zahlen immer eine höchstwertige Ziffer zwischen 0 und 4 (einschließlich), während negative Zahlen durch das 10er-Komplement der entsprechenden positiven Zahl dargestellt werden. Infolgedessen ermöglicht dieses System gepackten 32-Bit-BCD-Zahlen im Bereich von -50.000.000 bis +49.999.999, und -1 wird als 99999999 dargestellt. (Wie bei Binärzahlen mit Zweierkomplement ist der Bereich nicht symmetrisch um Null.)

Festkomma gepackte Dezimalzahl

Festkomma- Dezimalzahlen werden von einigen Programmiersprachen (wie COBOL, PL/I und Ada ) unterstützt. Diese Sprachen ermöglichen es dem Programmierer, einen impliziten Dezimalpunkt vor einer der Ziffern anzugeben. Ein mit den Bytes 12 34 56 7C codierter gepackter Dezimalwert stellt beispielsweise den Festkommawert +1.234.567 dar, wenn sich der implizierte Dezimalpunkt zwischen der 4. und 5. Stelle befindet:

12 34 56 7C
12 34.56 7+

Der Dezimalpunkt wird nicht wirklich im Speicher abgelegt, da das gepackte BCD-Speicherformat dies nicht vorsieht. Seine Position ist dem Compiler einfach bekannt, und der generierte Code verhält sich entsprechend für die verschiedenen arithmetischen Operationen.

Codierungen mit höherer Dichte

Wenn eine Dezimalziffer vier Bit erfordert, dann benötigen drei Dezimalziffern 12 Bit. Da jedoch 2 10 (1.024) größer als 10 3 (1.000) ist, werden nur 10 Bit benötigt, wenn drei Dezimalstellen zusammen codiert werden. Zwei solcher Kodierungen sind die Chen-Ho-Kodierung und die dicht gepackte Dezimalzahl (DPD). Letzteres hat den Vorteil, dass Teilmengen der Codierung zwei Ziffern in die optimalen sieben Bits und eine Ziffer in vier Bits kodieren, wie bei regulärem BCD.

Gezonte Dezimalzahl

Einige Implementierungen, beispielsweise IBM Mainframe-Systeme, unterstützen in Zonen aufgeteilte dezimale numerische Darstellungen. Jede Dezimalziffer wird in einem Byte gespeichert, wobei die unteren vier Bits die Ziffer in BCD-Form kodieren. Die oberen vier Bits, die "Zonen"-Bits genannt werden, werden normalerweise auf einen festen Wert gesetzt, so dass das Byte einen der Ziffer entsprechenden Zeichenwert enthält. EBCDIC-Systeme verwenden einen Zonenwert von 1111 (hex F); dies ergibt Bytes im Bereich F0 bis F9 (hex), die die EBCDIC-Codes für die Zeichen "0" bis "9" sind. Analog verwenden ASCII-Systeme einen Zonenwert von 0011 (hex 3), was die Zeichencodes 30 bis 39 (hex) ergibt.

Bei Dezimalwerten mit Vorzeichen in Zonen enthält das am weitesten rechts stehende (niedrigstwertige) Zonenhalbbyte die Vorzeichenziffer, die der gleiche Satz von Werten ist, die für vorzeichenbehaftete gepackte Dezimalzahlen verwendet werden (siehe oben). Somit repräsentiert ein als Hex-Bytes F1 F2 D3 codierter gezonter Dezimalwert den vorzeichenbehafteten Dezimalwert −123:

F1 F2 D3
1  2 −3

EBCDIC-Zonen-Dezimal-Umrechnungstabelle

BCD-Ziffer Hexadezimal EBCDIC-Zeichen
0+ C0 A0 E0 F0 { (*)   \ (*) 0
1+ C1 A1 E1 F1 EIN ~ (*)   1
2+ C2 A2 E2 F2 B S S 2
3+ C3 A3 E3 F3 C T T 3
4+ C4 A4 E4 F4 D du 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 ja Ja 8
9+ C9 A9 E9 F9 ich z Z 9
0− D0 B0     } (*) ^ (*)    
1− D1 B1     J      
2− D2 B2     K      
3− D3 B3     L      
4− D4 B4     m      
5− D5 B5     n      
6− D6 B6     Ö      
7− D7 B7     P      
8− D8 B8     Q      
9− D9 B9     R      

(*) Hinweis: Diese Zeichen variieren je nach Einstellung der lokalen Zeichencodeseite .

Festkomma-gezonte Dezimalzahl

Einige Sprachen (wie COBOL und PL/I) unterstützen direkt in Zonen aufgeteilte Festkomma-Dezimalwerte und weisen an einer Stelle zwischen den Dezimalstellen einer Zahl einen impliziten Dezimalpunkt zu. Bei einem sechs-Byte-Dezimalwert mit Vorzeichen und einem implizierten Dezimalpunkt rechts von der vierten Ziffer stellen die Hex-Bytes F1 F2 F7 F9 F5 C0 beispielsweise den Wert +1.279,50 dar:

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

BCD in Computern

IBM

IBM verwendete die Begriffe Binary-Coded Decimal Interchange Code (BCDIC, manchmal auch nur BCD genannt) für alphanumerische 6-Bit- Codes, die Zahlen, Großbuchstaben und Sonderzeichen darstellten. Einige Variationen der BCDIC- Alphamerik werden in den meisten frühen IBM-Computern verwendet, einschließlich der IBM 1620 (eingeführt 1959), der IBM 1400-Serie und Nicht- Dezimal-Architektur- Mitgliedern der IBM 700/7000-Serie .

Die IBM 1400-Serie sind zeichenadressierbare Maschinen, wobei jede Stelle sechs Bits enthält, die mit B, A, 8, 4, 2 und 1 gekennzeichnet sind, plus einem ungeraden Paritätsprüfbit ( C ) und einem Wortmarkenbit ( M ). Zum Codieren der Ziffern 1 bis 9 sind B und A Null und der Ziffernwert wird durch Standard-4-Bit-BCD in den Bits 8 bis 1 dargestellt . Für die meisten anderen Zeichen werden die Bits B und A einfach von den "12", "11" und "0" "Zonenstanzungen" im Lochkartenzeichencode abgeleitet , und die Bits 8 bis 1 von den 1 bis 9 Stanzungen. A "12 - Zone" punch gesetzt sowohl B und A , ein "Zone 11" Satz B , und eine "0 Zone" (a punch 0 in Verbindung mit jedem anderen) Satz A . So wird der Buchstabe A , der im Lochkartenformat (12,1) ist, codiert (B,A,1) . Das Währungssymbol $ , (11,8,3) in der Lochkarte wurde im Speicher als (B,8,2,1) codiert . Dadurch kann die Schaltung zwischen dem Lochkartenformat und dem internen Speicherformat mit nur wenigen Sonderfällen sehr einfach umgestellt werden. Ein wichtiger Sonderfall ist die Ziffer 0 , dargestellt durch einen einzelnen 0- Loch in der Karte und (8,2) im Kernspeicher.

Der Speicher des IBM 1620 ist in adressierbare 6-Bit-Ziffern organisiert, die üblichen 8, 4, 2, 1 plus F , die als Flagbit verwendet werden und C , ein ungerades Paritätsprüfbit. BCD- Alphamere werden mit Ziffernpaaren kodiert, wobei die "Zone" in der gerade adressierten Ziffer und die "Ziffer" in der ungeraden adressierten Ziffer steht, wobei die "Zone" sich auf die "Zonenstempel" 12 , 11 und 0 bezieht in der 1400er Serie. Eingabe/Ausgabe-Umsetzungshardware, die zwischen den internen Ziffernpaaren und den externen Standard-6-Bit-BCD-Codes umgewandelt wird.

In der Dezimalarchitektur werden IBM 7070 , IBM 7072 und IBM 7074 Alphamerics unter Verwendung von Ziffernpaaren (unter Verwendung von Zwei-aus-Fünf-Code in den Ziffern, nicht BCD) des 10-stelligen Wortes mit der "Zone" im kodiert linke Ziffer und die "Ziffer" in der rechten Ziffer. Eingabe/Ausgabe-Umsetzungshardware, die zwischen den internen Ziffernpaaren und den externen Standard-6-Bit-BCD-Codes umgewandelt wird.

Mit der Einführung von System/360 erweiterte IBM die 6-Bit-BCD- Alphamerik auf 8-Bit-EBCDIC, wodurch viele weitere Zeichen (zB Kleinbuchstaben) hinzugefügt werden können . Ein numerischer Datentyp gepackter BCD mit variabler Länge ist ebenfalls implementiert, der Maschinenbefehle bereitstellt, die Arithmetik direkt an gepackten Dezimaldaten ausführen.

Auf den IBM 1130 und 1800 wird gepackte BCD in der Software durch das Commercial Subroutine Package von IBM unterstützt.

BCD-Daten werden heute noch stark in IBM Prozessoren und Datenbanken wie IBM DB2 , Mainframes und Power6 verwendet . Bei diesen Produkten ist das BCD normalerweise in Zonen unterteiltes BCD (wie in EBCDIC oder ASCII), gepacktes BCD (zwei Dezimalstellen pro Byte) oder „reine“ BCD-Codierung (eine Dezimalstelle wird als BCD in den unteren vier Bits jedes Bytes gespeichert). . All dies wird in Hardwareregistern und Verarbeitungseinheiten sowie in Software verwendet. Um gepackte Dezimalzahlen in EBCDIC-Tabellenentladungen in lesbare Zahlen umzuwandeln, können Sie die Maske OUTREC FIELDS des JCL-Dienstprogramms DFSORT verwenden.

Andere Computer

Die VAX-11-Serie von Digital Equipment Corporation enthält Befehle , die direkt mit gepackten BCD-Daten rechnen und zwischen gepackten BCD-Daten und anderen ganzzahligen Darstellungen konvertieren können. Das gepackte BCD-Format des VAX ist mit dem auf IBM System/360 und späteren kompatiblen Prozessoren von IBM kompatibel. Die MicroVAX- und späteren VAX-Implementierungen ließen diese Fähigkeit von der CPU weg, behielten jedoch die Codekompatibilität mit früheren Maschinen bei, indem die fehlenden Anweisungen in einer vom Betriebssystem bereitgestellten Softwarebibliothek implementiert wurden. Dies wird automatisch über die Ausnahmebehandlung aufgerufen , wenn die veralteten Anweisungen angetroffen werden, so dass Programme, die sie verwenden, ohne Modifikation auf den neueren Maschinen ausgeführt werden können.

Die Intel x86- Architektur unterstützt ein einzigartiges 18-stelliges (zehn Byte) BCD-Format , das in die Gleitkommaregister geladen und gespeichert werden kann, von wo aus Berechnungen durchgeführt werden können.

Die Motorola 68000-Serie hatte BCD-Anweisungen.

In neueren Computern werden solche Fähigkeiten fast immer in Software statt im Befehlssatz der CPU implementiert, aber numerische BCD-Daten sind in kommerziellen und finanziellen Anwendungen immer noch sehr verbreitet. Es gibt Tricks, um gepackte BCD- und dezimale Addier- oder Subtraktionsoperationen mit kurzen, aber schwer verständlichen Sequenzen wortparalleler Logik und binärer arithmetischer Operationen zu implementieren. Der folgende Code (in C geschrieben ) berechnet beispielsweise eine vorzeichenlose 8-stellige gepackte BCD-Addition mit 32-Bit-Binäroperationen:

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 in der Elektronik

BCD ist in elektronischen Systemen weit verbreitet, in denen ein numerischer Wert angezeigt werden soll, insbesondere in Systemen, die ausschließlich aus digitaler Logik bestehen und keinen Mikroprozessor enthalten. Durch die Verwendung von BCD kann die Manipulation numerischer Daten für die Anzeige stark vereinfacht werden, indem jede Ziffer als separate einzelne Unterschaltung behandelt wird. Dies entspricht viel besser der physikalischen Realität von Display-Hardware – ein Designer könnte sich beispielsweise dafür entscheiden, eine Reihe von separaten, identischen Sieben-Segment-Displays zu verwenden, um eine Messschaltung aufzubauen. Wenn die numerische Größe als reine Binärgröße gespeichert und manipuliert würde, würde die Verbindung mit einer solchen Anzeige eine komplexe Schaltung erfordern. In Fällen, in denen die Berechnungen relativ einfach sind, kann daher das durchgehende Arbeiten mit BCD zu einem insgesamt einfacheren System führen als die Konvertierung in und aus binär. Die meisten Taschenrechner führen alle ihre Berechnungen in BCD durch.

Das gleiche Argument gilt, wenn Hardware dieser Art einen eingebetteten Mikrocontroller oder einen anderen kleinen Prozessor verwendet. Häufig führt die interne Darstellung von Zahlen im BCD-Format zu kleinerem Code, da eine Konvertierung von oder in eine binäre Darstellung auf derart begrenzten Prozessoren teuer sein kann. Für diese Anwendungen verfügen einige kleine Prozessoren über dedizierte arithmetische Modi, die beim Schreiben von Routinen helfen, die BCD-Größen manipulieren.

Operationen mit BCD

Zusatz

Es ist möglich, eine Addition durchzuführen, indem Sie zuerst eine Binärdatei hinzufügen und anschließend in BCD konvertieren. Die Umwandlung der einfachen Summe zweier Ziffern kann durch Addieren von 6 (d. h. 16 − 10) erfolgen, wenn das Fünf-Bit-Ergebnis der Addition eines Ziffernpaares einen Wert größer als 9 hat 16 mögliche 4-Bit-BCD-Werte (da 2 4 = 16), aber nur 10 Werte sind gültig (0000 bis 1001). Zum Beispiel:

1001 + 1000 = 10001
   9 +    8 =    17

10001 ist die binäre, nicht dezimale Darstellung des gewünschten Ergebnisses, aber die höchstwertige 1 (der "Übertrag") passt nicht in eine 4-Bit-Binärzahl. In BCD wie in Dezimal kann kein Wert größer als 9 (1001) pro Ziffer existieren. Um dies zu korrigieren, wird 6 (0110) zur Summe addiert, und dann wird das Ergebnis als zwei Knabbereien behandelt:

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

Die beiden Halbbytes des Ergebnisses 0001 und 0111 entsprechen den Ziffern "1" und "7". Dies ergibt "17" in BCD, was das richtige Ergebnis ist.

Diese Technik kann auf das Hinzufügen mehrerer Ziffern durch Hinzufügen in Gruppen von rechts nach links erweitert werden, wobei die zweite Ziffer als Übertrag weitergegeben wird, wobei das 5-Bit-Ergebnis jeder Ziffernpaarsumme immer mit 9 verglichen wird. Einige CPUs bieten ein Halbübertrags-Flag um BCD-arithmetische Anpassungen nach binären Additions- und Subtraktionsoperationen zu erleichtern. Die Z80-CPU bietet den Opcode DAA, Decimal Adjust Accumulator, DAA

Subtraktion

Die Subtraktion erfolgt, indem das Zehnerkomplement des Subtrahends zum Minuend addiert wird . Um das Vorzeichen einer Zahl in BCD darzustellen, wird die Zahl 0000 verwendet, um eine positive Zahl darzustellen , und 1001 wird verwendet, um eine negative Zahl darzustellen . Die restlichen 14 Kombinationen sind ungültige Zeichen. Um die vorzeichenbehaftete BCD-Subtraktion zu veranschaulichen, betrachten Sie das folgende Problem: 357 − 432.

In BCD mit Vorzeichen ist 357 0000 0011 0101 0111. Das Zehnerkomplement von 432 kann erhalten werden, indem man das Neunerkomplement von 432 nimmt und dann eins addiert. Also, 999 − 432 = 567 und 567 + 1 = 568. Indem 568 in BCD mit dem negativen Vorzeichencode vorangestellt wird, kann die Zahl −432 dargestellt werden. −432 im vorzeichenbehafteten BCD ist also 1001 0101 0110 1000.

Da beide Zahlen nun in BCD mit Vorzeichen dargestellt sind, können sie addiert werden:

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

Da BCD eine Form der Dezimaldarstellung ist, sind einige der obigen Ziffernsummen ungültig. Falls ein ungültiger Eintrag (jede BCD-Ziffer größer als 1001) existiert, wird 6 hinzugefügt, um ein Übertragsbit zu erzeugen und zu bewirken, dass die Summe ein gültiger Eintrag wird. Wenn Sie also 6 zu den ungültigen Einträgen hinzufügen, ergibt sich Folgendes:

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

Das Ergebnis der Subtraktion ist also 1001 1001 0010 0101 (−925). Um das Ergebnis zu bestätigen, beachten Sie, dass die erste Ziffer 9 ist, was negativ bedeutet. Dies scheint richtig zu sein, da 357 − 432 eine negative Zahl ergeben sollten. Die verbleibenden Halbbytes sind BCD, 1001 0010 0101 ist also 925. Das Zehnerkomplement von 925 ist 1000 − 925 = 75, das berechnete Ergebnis ist also −75.

Wenn eine andere Anzahl von Nibbles addiert wird (zB 1053 − 2), muss der Zahl mit den weniger Stellen zunächst Nullen vorangestellt werden, bevor das Zehnerkomplement gebildet oder subtrahiert wird. Bei 1053 − 2 müsste also 2 zunächst als 0002 in BCD dargestellt und das Zehnerkomplement von 0002 berechnet werden.

Vergleich mit rein binär

Vorteile

  • Viele nicht-ganzzahlige Werte, z. B. dezimal 0,2, haben eine unendliche Stellenwertdarstellung in Binär (.001100110011...), aber einen endlichen Stellenwert in binärcodiertem Dezimal (0,0010). Folglich vermeidet ein System, das auf binärcodierten Dezimaldarstellungen von Dezimalbrüchen basiert, Fehler bei der Darstellung und Berechnung solcher Werte. Dies ist nützlich bei Finanzberechnungen.
  • Die Skalierung mit einer Potenz von 10 ist einfach.
  • Das Runden an einer Dezimalstellengrenze ist einfacher. Addition und Subtraktion in Dezimalzahlen müssen nicht gerundet werden.
  • Das Angleichen von zwei Dezimalzahlen (zum Beispiel 1,3 + 27,08) ist eine einfache, genaue Verschiebung.
  • Die Umwandlung in eine Zeichenform oder für die Anzeige (z. B. in ein textbasiertes Format wie XML oder zum Ansteuern von Signalen für eine Siebensegmentanzeige ) ist eine einfache Abbildung pro Ziffer und kann linear erfolgen ( O ( n )) Zeit. Die Umwandlung von reinem Binärsystem erfordert eine relativ komplexe Logik, die sich über Ziffern erstreckt, und für große Zahlen ist kein Linearzeit-Umwandlungsalgorithmus bekannt (siehe Binäres Zahlensystem § Umwandlung in und aus anderen Zahlensystemen ).

Nachteile

  • Einige Operationen sind komplexer zu implementieren. Addierer erfordern zusätzliche Logik, damit sie vorzeitig umbrechen und einen Übertrag erzeugen. Für BCD-Add werden 15 bis 20 Prozent mehr Schaltungen benötigt als für reine Binärdateien. Die Multiplikation erfordert die Verwendung von Algorithmen, die etwas komplexer sind als Shift-Mask-Add (eine binäre Multiplikation , die binäre Verschiebungen und Additionen oder das Äquivalent pro Ziffer oder Zifferngruppe erfordert).
  • Standard-BCD benötigt vier Bits pro Ziffer, ungefähr 20 Prozent mehr Platz als eine binäre Kodierung (das Verhältnis von 4 Bit zu log 2 10 Bit beträgt 1,204). Wenn es so gepackt wird, dass drei Ziffern in zehn Bits codiert werden, wird der Speicher-Overhead stark reduziert, auf Kosten einer Codierung, die nicht mit den 8-Bit-Bytegrenzen ausgerichtet ist, die auf existierender Hardware üblich sind, was zu langsameren Implementierungen auf diesen Systemen führt.
  • Praktische existierende Implementierungen von BCD sind typischerweise langsamer als Operationen auf binären Darstellungen, insbesondere auf eingebetteten Systemen, aufgrund der begrenzten Prozessorunterstützung für native BCD-Operationen.

Darstellungsvarianten

Es gibt verschiedene BCD-Implementierungen, die andere Darstellungen für Zahlen verwenden. Programmierbare Rechner, die von Texas Instruments , Hewlett-Packard und anderen hergestellt werden, verwenden typischerweise ein Gleitkomma- BCD-Format, typischerweise mit zwei oder drei Stellen für den (Dezimal-)Exponenten. Die zusätzlichen Bits der Vorzeichenziffer können verwendet werden, um spezielle numerische Werte wie unendlich , Unterlauf / Überlauf und Fehler (eine blinkende Anzeige) anzuzeigen.

Signierte Variationen

Vorzeichenbehaftete Dezimalwerte können auf verschiedene Weise dargestellt werden. Die Programmiersprache COBOL unterstützt beispielsweise fünf in Zonen unterteilte Dezimalformate, wobei jedes das Zahlenzeichen anders codiert:

Typ Beschreibung Beispiel
Ohne Vorzeichen Kein Vorzeichen knabbern F1 F2 F3
Signiert nachgestellt (kanonisches Format) Vorzeichen-Nibble im letzten (niedrigstwertigen) Byte F1 F2 C3
Vorzeichen signiert (Aufschlag) Vorzeichen-Nibble im ersten (höchsten) Byte C1 F2 F3
Signiert nachfolgend separat Separates Vorzeichenbyte ( '+'oder '−') nach den Ziffernbytes F1 F2 F3 2B
Signiert führend separat Separates Vorzeichenbyte ( '+'oder '−') vor den Ziffernbytes 2B F1 F2 F3

Telefonie binär codierte Dezimalzahl (TBCD)

3GPP hat TBCD entwickelt , eine Erweiterung zu BCD, bei der die verbleibenden (unbenutzten) Bitkombinationen verwendet werden, um bestimmte Telefonzeichen hinzuzufügen , mit Ziffern, die denen im Originaldesign von Telefontastaturen ähneln .

dezimal
digit
TBCD
8 4 2 1
* 1 0 1 0
# 1 0 1 1
ein 1 1 0 0
B 1 1 0 1
C 1 1 1 0
Wird als Füller verwendet, wenn eine ungerade Anzahl von Stellen vorhanden ist 1 1 1 1

Das erwähnte 3GPP-Dokument definiert TBCD-STRING mit vertauschten Nibbles in jedem Byte. Bits, Oktette und Ziffern indiziert ab 1, Bits von rechts, Ziffern und Oktette von links.

Bits 8765 des Oktetts n Codierung von Ziffer 2 n

Bits 4321 von Oktett n Codierung Ziffer 2( n – 1) + 1

Bedeutung Nummer 1234, würde 21 43in TBCD werden.

Alternative Kodierungen

Wenn Darstellungs- und Berechnungsfehler wichtiger sind als die Geschwindigkeit der Umwandlung zur und von der Anzeige, kann eine skalierte Binärdarstellung verwendet werden, die eine Dezimalzahl als binärcodierte ganze Zahl und einen binärcodierten vorzeichenbehafteten Dezimalexponenten speichert. 0,2 kann beispielsweise als 2 × 10 1 dargestellt werden .

Diese Darstellung ermöglicht eine schnelle Multiplikation und Division, erfordert jedoch möglicherweise eine Verschiebung um eine Zehnerpotenz während der Addition und Subtraktion, um die Dezimalpunkte auszurichten. Es eignet sich für Anwendungen mit einer festen Anzahl von Nachkommastellen, die diese Anpassung dann nicht erfordern – insbesondere Finanzanwendungen, bei denen in der Regel 2 oder 4 Nachkommastellen ausreichen. Tatsächlich ist dies fast eine Form der Festpunktarithmetik, da die Position des Radixpunktes impliziert wird.

Die Hertz- und Chen-Ho-Kodierungen bieten Boolesche Transformationen zum Umwandeln von Gruppen von drei BCD-kodierten Ziffern in und von 10-Bit-Werten, die effizient in Hardware mit nur 2 oder 3 Gatterverzögerungen kodiert werden können. Dicht gepacktes Dezimal (DPD) ist ein ähnliches Schema, das für die meisten Signifikanten , mit Ausnahme der führenden Ziffer, für eine der beiden alternativen Dezimalkodierungen verwendet wird, die im Gleitkomma-Standard IEEE 754-2008 spezifiziert sind .

Anwendung

Das BIOS in vielen PCs speichert Datum und Uhrzeit in BCD, weil der MC6818- Echtzeituhrchip, der im ursprünglichen IBM PC AT- Motherboard verwendet wurde, die in BCD codierte Zeit bereitstellte. Dieses Formular kann zur Anzeige leicht in ASCII umgewandelt werden.

Die Atari 8-Bit- Computerfamilie verwendet BCD, um Gleitkomma-Algorithmen zu implementieren. Der Prozessor MOS 6502 hat einen BCD-Modus, der die Additions- und Subtraktionsbefehle beeinflusst. Die vom Hersteller bereitgestellte Software des Handheld-Computers Psion Organizer 1 verwendet ebenfalls vollständig BCD, um Gleitkommazahlen zu implementieren; spätere Psion-Modelle verwendeten ausschließlich binäre.

Frühe Modelle der PlayStation 3 speichern Datum und Uhrzeit in BCD. Dies führte am 1. März 2010 zu einem weltweiten Ausfall der Konsole. Die letzten beiden Ziffern des als BCD gespeicherten Jahres wurden als 16 fehlinterpretiert, was zu einem Fehler im Datum des Geräts führte, wodurch die meisten Funktionen funktionsunfähig wurden. Dies wurde als das Jahr-2010-Problem bezeichnet .

Rechtsgeschichte

Im Fall Gottschalk v. Benson von 1972 hob der Oberste Gerichtshof der USA eine Entscheidung einer Vorinstanz auf , die ein Patent zur Umwandlung von BCD-codierten Zahlen in Binärzahlen auf einem Computer erlaubt hatte . Die Entscheidung stellte fest, dass ein Patent "die mathematische Formel vollständig vorwegnehmen würde und in der Praxis ein Patent auf den Algorithmus selbst wäre". Dies war ein wegweisendes Urteil, das die Patentierbarkeit von Software und Algorithmen bestimmt.

Siehe auch

Anmerkungen

Verweise

Weiterlesen

Externe Links