Zecimal codat binar - Binary-coded decimal

Un ceas binar ar putea utiliza LED-uri pentru a exprima valorile binare. În acest ceas, fiecare coloană de LED-uri arată un număr zecimal codat binar al timpului sexagesimal tradițional .

În sistemele electronice și de calcul , zecimalul codat binar ( BCD ) este o clasă de codificări binare a numerelor zecimale în care fiecare cifră este reprezentată de un număr fix de biți , de obicei patru sau opt. Uneori, modele speciale de biți sunt utilizate pentru un semn sau alte indicații (de exemplu, eroare sau depășire).

În sistemele orientate pe octeți (adică cele mai multe computere moderne), termenul BCD despachetat implică de obicei un octet complet pentru fiecare cifră (adesea incluzând un semn), în timp ce BCD împachetat codifică de obicei două cifre într-un singur octet, profitând de faptul că patru biții sunt suficienți pentru a reprezenta intervalul de la 0 la 9. Codificarea precisă pe 4 biți, totuși, poate varia din motive tehnice (de exemplu, Excess-3 ).

Cele zece state care reprezintă o cifră BCD sunt numite uneori tetrades (pentru ciuguli de obicei necesară pentru a le dețină este , de asemenea , cunoscut ca un Tetrade) , în timp ce nefolosite, nu - mi pasă -states sunt numite pseudo-tetradă (e) s  [ de ] , pseudo-zecimale sau pseudo-zecimale .

Principala virtute a BCD, în comparație cu sistemele de poziție binare , este reprezentarea mai precisă și rotunjirea cantităților zecimale, precum și ușurința sa de conversie în reprezentări convenționale care pot fi citite de om. Principalele sale dezavantaje sunt o ușoară creștere a complexității circuitelor necesare pentru implementarea aritmeticii de bază, precum și stocarea ușor mai puțin densă.

BCD a fost utilizat în multe computere zecimale timpurii și este implementat în setul de instrucțiuni de mașini, cum ar fi seria IBM System / 360 și descendenții săi, VAX- ul Digital Equipment Corporation , Burroughs B1700 și procesoarele Motorola 68000- series. BCD în sine nu este la fel de utilizat ca în trecut și nu mai este implementat în seturile de instrucțiuni ale computerelor mai noi (de exemplu, ARM ); x86 nu mai acceptă instrucțiunile sale BCD în modul lung . Cu toate acestea, formatele zecimale în virgulă fixă și virgulă mobilă sunt încă importante și continuă să fie utilizate în calculele financiare, comerciale și industriale, unde conversia subtilă și erorile de rotunjire fracționare care sunt inerente reprezentărilor binare în virgulă mobilă nu pot fi tolerate.

fundal

BCD profită de faptul că orice cifră zecimală poate fi reprezentată printr-un model de patru biți. Cel mai evident mod de codificare a cifrelor este Natural BCD (NBCD), unde fiecare cifră zecimală este reprezentată de valoarea sa binară corespunzătoare de patru biți, așa cum se arată în tabelul următor. Aceasta se mai numește codare „8421”.

Cifră zecimală 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

Această schemă poate fi, de asemenea, denumită Zecimală Codată Binară Simplă ( SBCD ) sau BCD 8421 și este cea mai comună codificare. Altele includ așa-numita codificare „4221” și „7421” - denumită după ponderarea utilizată pentru biți - și „ Excess-3 ”. De exemplu, cifra BCD 6, 0110'bîn notația 8421, este 1100'bîn 4221 (două codificări sunt posibile), 0110'bîn 7421, în timp ce în Exces-3 este 1001'b( ).

Coduri BCD pe 4 biți și pseudo-tetrade
Pic Greutate  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15         cometariu        
4 8 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 Binar
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
Nume 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Zecimal
8 4 2 1 (XS-0) 0 1 2 3 4 5 6 7 8 9 10 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
Exces-3 (XS-3) -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12
Exces-6 (XS-6) -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9
Salt la 2 (2 4 2 1) 0 1             2 3 4 5 6 7 8 9
Salt la 8 (2 4 2 1) 0 1 2 3 4 5 6 7             8 9
4 2 2 1 (I) 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    
Alb (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 15
Banda magnetica   1 2 3 4 5 6 7 8 9 0          
Paul   1 3 2 6 7 5 4   0     8 9    
gri 0 1 3 2 7 6 4 5 15 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 (Wați) 0 1 3 2     4   9 8 6 7     5  
5-ciclic 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    
Exces-3 Grey -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
Lucal 0 15 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  
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 10 11 12 13 14 15

Tabelul următor reprezintă cifre zecimale de la 0 la 9 în diferite sisteme de codificare BCD. În anteturi, „ ” indică greutatea fiecărui bit. În coloana a cincea („BCD 8 4 −2 −1”), două dintre greutăți sunt negative. Sunt prezentate atât codurile de caractere ASCII, cât și cele EBCDIC pentru cifre, care sunt exemple de BCD zonate. 8421

 
Cifră
BCD
8 4 2 1
 Codul Stibitz sau Excess-3 Cod Aiken sau 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

Deoarece majoritatea computerelor tratează date în octeți pe 8 biți , este posibil să utilizați una dintre următoarele metode pentru a codifica un număr BCD:

  • Neambalat : fiecare cifră zecimală este codificată într-un octet, cu patru biți reprezentând numărul, iar restul de biți nu au nicio semnificație.
  • Prânz : Două cifre zecimale sunt codificate într - un singur octet, cu o singură cifră , în mai puțin semnificativi tetradă ( biții 0 3 ) , iar cealaltă numeral în cele mai semnificative tetradă (biții 4 până la 7).

De exemplu, codificarea numărului zecimal 91utilizând BCD neambalat are ca rezultat următorul model binar de doi octeți:

Decimal:         9         1
Binary : 0000 1001 0000 0001

În BCD ambalat, același număr s-ar potrivi într-un singur octet:

Decimal:   9    1
Binary: 1001 0001

Prin urmare, intervalul numeric pentru un octet BCD neambalat este de la zero la nouă inclusiv, în timp ce intervalul pentru un octet BCD ambalat este de la zero la nouăzeci și nouă inclusiv.

Pentru a reprezenta numere mai mari decât intervalul unui singur octet poate fi utilizat orice număr de octeți adiacenți. De exemplu, pentru a reprezenta numărul zecimal 12345în BCD ambalat, utilizând formatul big-endian , un program ar codifica după cum urmează:

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

Aici, cea mai semnificativă ciugulire a celui mai semnificativ octet a fost codificată ca zero, deci numărul este stocat ca 012345(dar rutinele de formatare ar putea înlocui sau elimina zerourile din partea de sus). BCD ambalat este mai eficient în utilizarea stocării decât BCD neambalat; codificarea aceluiași număr (cu zero din partea de sus) în format neambalat ar consuma de două ori spațiul de stocare.

Operațiile de schimbare și mascare sunt utilizate pentru a ambala sau despacheta o cifră BCD ambalată. Alte operații bit-bit sunt folosite pentru a converti o cifră în modelul său de biți echivalent sau pentru a inversa procesul.

BCD ambalat

În BCD ambalat (sau pur și simplu zecimal ambalat ), fiecare dintre cele două ciugulite ale fiecărui octet reprezintă o cifră zecimală. Packed BCD a fost utilizat din cel puțin anii 1960 și este implementat în toate componentele hardware mainframe IBM de atunci. Majoritatea implementărilor sunt mari endian , adică cu cifra mai semnificativă în jumătatea superioară a fiecărui octet și cu octetul cel mai la stânga (care se află la cea mai mică adresă de memorie) conținând cele mai semnificative cifre ale valorii zecimale împachetate. Ciugulitul inferior al octetului din dreapta este de obicei folosit ca semnalizator, deși unele reprezentări nesemnate nu au un semnalizator. De exemplu, o valoare de 4 octeți constă din 8 ronțuri, în care cele 7 ronțele superioare stochează cifrele unei valori zecimale de 7 cifre, iar cea mai mică ronțăie indică semnul valorii întregi zecimale.

Valorile standard ale semnelor sunt 1100 ( hex C) pentru pozitiv (+) și 1101 (D) pentru negativ (-). Această convenție provine din câmpul zonei pentru caracterele EBCDIC și reprezentarea semnată overpunch . Alte semne permise sunt 1010 (A) și 1110 (E) pentru pozitiv și 1011 (B) pentru negativ. Procesoarele IBM System / 360 vor utiliza semnele 1010 (A) și 1011 (B) dacă bitul A este setat în PSW, pentru standardul ASCII-8 care nu a trecut niciodată. Majoritatea implementărilor furnizează, de asemenea, valori BCD nesemnate cu un nibble de semn de 1111 (F). ILE RPG folosește 1111 (F) pentru pozitiv și 1101 (D) pentru negativ. Acestea se potrivesc zonei EBCDIC pentru cifre fără o suprasolicitare a semnelor. În BCD ambalat, numărul 127 este reprezentat de 0001 0010 0111 1100 (127C) și −127 este reprezentat de 0001 0010 0111 1101 (127D). Sistemele Burroughs au folosit 1101 (D) pentru negative și orice altă valoare este considerată o valoare a semnului pozitiv (procesoarele vor normaliza un semn pozitiv la 1100 (C)).


Cifra semnului
BCD
8 4 2 1
Semn Note
A 1 0 1 0 +  
B 1 0 1 1 -  
C 1 1 0 0 + Preferat
D 1 1 0 1 - Preferat
E 1 1 1 0 +  
F 1 1 1 1 + Nesemnat

Indiferent cât de mulți octeți are un cuvânt , există întotdeauna un număr par de ronțăituri, deoarece fiecare octet are două dintre ele. Prin urmare, un cuvânt de n octeți poate conține până la (2 n ) -1 cifre zecimale, care este întotdeauna un număr impar de cifre. Este necesar un număr zecimal cu d cifre1/2( d +1) octeți de spațiu de stocare.

De exemplu, un cuvânt de 4 octeți (32 de biți) poate conține șapte cifre zecimale plus un semn și poate reprezenta valori cuprinse între ± 9.999.999. Astfel, numărul −1.234.567 are 7 cifre lățime și este codificat ca:

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

La fel ca șirurile de caractere, primul octet al zecimalei împachetate - cel cu cele mai semnificative două cifre - este de obicei stocat în cea mai mică adresă din memorie, independent de endianitatea mașinii.

În schimb, numărul întreg al unui număr binar de 4 octeți poate reprezenta valori de la -2147,483,648 până la +2,147,483,647.

În timp ce BCD-ul împachetat nu utilizează în mod optim stocarea (folosind aproximativ 20% mai multă memorie decât notația binară pentru a stoca aceleași numere), conversia în ASCII , EBCDIC sau diferitele codificări ale Unicode se face banal, deoarece nu sunt necesare operații aritmetice. Cerințele suplimentare de stocare sunt, de obicei, compensate de necesitatea de precizie și compatibilitate cu calculatorul sau calculul manual pe care le oferă aritmetica zecimală cu punct fix. Există ambalaje mai dense de BCD care evită penalizarea de stocare și, de asemenea, nu au nevoie de operații aritmetice pentru conversii obișnuite.

Packed BCD este acceptat în limbajul de programare COBOL ca tip de date „COMPUTATIONAL-3” (o extensie IBM adoptată de mulți alți furnizori de compilatoare) sau „PACKED-DECIMAL” (parte a standardului COBOL din 1985). Este acceptat în PL / I ca „DECIMAL FIX”. În afară de mainframe-urile IBM System / 360 și ulterioare, BCD-ul împachetat este implementat în setul de instrucțiuni native al procesoarelor VAX originale de la Digital Equipment Corporation și unele modele ale mainframe-urilor din seria SDS Sigma și este formatul nativ pentru Burroughs Corporation Medium Systems linie de mainframe (descendente din seria Electrodata 200 din anii 1950 ).

Reprezentările complementare ale zece pentru numerele negative oferă o abordare alternativă la codificarea semnului numerelor BCD ambalate (și altor). În acest caz, numerele pozitive au întotdeauna cifra cea mai semnificativă între 0 și 4 (inclusiv), în timp ce numerele negative sunt reprezentate de complementul 10 al numărului pozitiv corespunzător. Ca urmare, acest sistem permite ca numerele BCD ambalate pe 32 de biți să varieze de la -50.000.000 la +49.999.999 și -1 este reprezentat ca 99999999. (Ca și în cazul numerelor binare complementare ale celor doi, intervalul nu este simetric cu zero).

Punct fix fix zecimal

Numerele zecimale cu punct fix sunt acceptate de unele limbaje de programare (cum ar fi COBOL, PL / I și Ada ). Aceste limbaje permit programatorului să specifice un punct zecimal implicit în fața uneia dintre cifre. De exemplu, o valoare zecimală împachetată codificată cu octeții 12 34 56 7C reprezintă valoarea punctului fix +1.234.567 atunci când punctul zecimal implicit este situat între a 4-a și a 5-a cifră:

12 34 56 7C
12 34.56 7+

Punctul zecimal nu este stocat în memorie, deoarece formatul de stocare BCD ambalat nu prevede acest lucru. Locația sa este pur și simplu cunoscută de compilator, iar codul generat acționează în consecință pentru diferitele operații aritmetice.

Codificări cu densitate mai mare

Dacă o cifră zecimală necesită patru biți, atunci trei cifre zecimale necesită 12 biți. Cu toate acestea, deoarece 2 10 (1.024) este mai mare decât 10 3 (1.000), dacă trei cifre zecimale sunt codificate împreună, sunt necesari doar 10 biți. Două astfel de codificări sunt codificarea Chen – Ho și zecimalul dens dens (DPD). Acesta din urmă are avantajul că subseturile codării codifică două cifre în cei șapte biți optimi și o cifră în patru biți, ca în BCD obișnuit.

Zecimală zonată

Unele implementări, de exemplu sistemele mainframe IBM , acceptă reprezentări numerice zecimale zonate . Fiecare cifră zecimală este stocată într-un octet, cu cei patru biți inferiori care codifică cifra în formă BCD. Cei patru biți superiori, numiți biții „de zonă”, sunt de obicei setați la o valoare fixă, astfel încât octetul să dețină o valoare de caracter corespunzătoare cifrei. Sistemele EBCDIC utilizează o valoare a zonei de 1111 (hex F); aceasta produce octeți în intervalul F0 - F9 (hex), care sunt codurile EBCDIC pentru caracterele "0" până la "9". În mod similar, sistemele ASCII utilizează o valoare de zonă 0011 (hex 3), oferind coduri de caractere 30-39 (hex).

Pentru valorile zecimale zonate semnate, zona cea mai dreaptă (cea mai puțin semnificativă) are o cifră de semn, care este același set de valori care sunt utilizate pentru numerele zecimale semnate (a se vedea mai sus). Astfel, o valoare zecimală zonată codificată ca octeți hexagonali F1 F2 D3 reprezintă valoarea zecimală semnată −123:

F1 F2 D3
1  2 −3

Tabel de conversie zecimală zonată EBCDIC

Cifră BCD Hexadecimal Caracter EBCDIC
0+ C0 A0 E0 F0 {(*)   \ (*) 0
1+ C1 A1 E1 F1 A ~ (*)   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 tu 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 y Da 8
9+ C9 A9 E9 F9 Eu 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     O      
7− D7 B7     P      
8− D8 B8     Î      
9− D9 B9     R      

(*) Notă: Aceste caractere variază în funcție de setarea paginii de cod a caracterelor locale .

Zecimal zonat cu punct fix

Unele limbi (cum ar fi COBOL și PL / I) acceptă în mod direct valori zecimale zonate cu punct fix, atribuind un punct zecimal implicit la o anumită locație între cifrele zecimale ale unui număr. De exemplu, având în vedere o valoare zecimală zonată semnată cu șase octeți, cu un punct zecimal implicit în dreapta celei de-a patra cifre, octeții hexagonali F1 F2 F7 F9 F5 C0 reprezintă valoarea + 1.279,50:

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

BCD în computere

IBM

IBM a folosit termenii Cod binar codificat pentru schimbul zecimal (BCDIC, uneori numit doar BCD), pentru coduri alfanumerice pe 6 biți care reprezentau numere, litere mari și caractere speciale. Unele variație a BCDIC alphamerics este utilizat în majoritatea calculatoarelor IBM timpurie, inclusiv IBM 1620 (introdus în 1959), 1400 seria IBM și non - Zecimal Arhitectura membri ai seriei IBM 700/7000 .

Seriile IBM 1400 sunt mașini adresabile caracterelor, fiecare locație fiind de șase biți etichetați B, A, 8, 4, 2 și 1, plus un bit de verificare a parității impare ( C ) și un bit de marcare a cuvântului ( M ). Pentru codificarea cifrelor de la 1 la 9 , B și A sunt zero și valoarea cifrei reprezentată de BCD standard pe 4 biți în biții 8 până la 1 . Pentru majoritatea celorlalte caractere, biții B și A sunt derivați pur și simplu din "12", "11" și "0" "puncte de zonă" în codul de caracter al cărții perforate , și biții 8 până la 1 de la 1 până la 9 perforări. A "zonă de 12" pumn set atât B și A , un "11 zone" set B , și o "zona 0" (a 0 pumn combinate cu oricare altele) set A . Astfel litera A , care este (12,1) în formatul cartelei perforate, este codificată (B, A, 1) . Simbolul monedei $ , (11,8,3) în cartea perforată, a fost codificat în memorie ca (B, 8,2,1) . Acest lucru permite circuitelor să convertească între formatul cardului perforat și formatul de stocare intern să fie foarte simplu, cu doar câteva cazuri speciale. Un caz special important este cifra 0 , reprezentată de un pumn 0 singur în card și (8,2) în memoria de bază.

Memoria IBM 1620 este organizată în cifre adresabile pe 6 biți, obișnuitele 8, 4, 2, 1 plus F , utilizate ca bit de semnalizare și C , un bit de verificare a parității. Alfamerica BCD este codificată folosind perechi de cifre, cu „zona” în cifra cu adresă pară și „cifra” în cifra cu adresă impară, „zona” fiind legată de „punctele de zonă” 12 , 11 și 0 ca în seria 1400. Hardware de traducere de intrare / ieșire convertit între perechile de cifre interne și codurile BCD standard pe 6 biți.

În Decimal Arhitectura IBM 7070 , IBM 7072 și IBM 7074 alphamerics sunt codate folosind perechile numerice (folosind două out-of-cinci cod în cifre, nu BCD) ale cuvântului 10 cifre, cu „zona“ , în cifra din stânga și „cifra” din cifra din dreapta. Hardware de traducere de intrare / ieșire convertit între perechile de cifre interne și codurile BCD standard pe 6 biți.

Odată cu introducerea System / 360 , IBM a extins BCD alfa -6-bit la 8-bit EBCDIC, permițând adăugarea a mult mai multe caractere (de exemplu, litere mici). De asemenea, este implementat un tip numeric de date numerice BCD ambalate , care oferă instrucțiuni ale mașinii care efectuează aritmetica direct pe datele zecimale ambalate.

Pe IBM 1130 și 1800 , BCD-ul ambalat este acceptat în software de pachetul comercial de subrutine IBM.

Astăzi, datele BCD sunt încă puternic utilizate în procesoarele și bazele de date IBM , cum ar fi IBM DB2 , mainframes și Power6 . În aceste produse, BCD este de obicei BCD zonat (ca în EBCDIC sau ASCII), BCD împachetat (două cifre zecimale pe octet) sau codificare BCD „pură” (o cifră zecimală stocată ca BCD în cei patru biți inferiori ai fiecărui octet) . Toate acestea sunt utilizate în registrele hardware și în unitățile de procesare și în software. Pentru a converti zecimale împachetate în descărcările tabelului EBCDIC în numere lizibile, puteți utiliza masca OUTREC FIELDS a utilitarului JCL DFSORT.

Alte computere

Digital Equipment Corporation seria VAX-11 include instrucțiuni care pot efectua aritmetica direct pe datele BCD ambalate și pot converti între datele BCD ambalate și alte reprezentări întregi. Formatul BCD ambalat al VAX este compatibil cu cel de pe IBM System / 360 și procesoarele compatibile ulterioare IBM. Implementările MicroVAX și ulterior VAX au renunțat la această capacitate din CPU, dar au păstrat compatibilitatea codului cu mașinile anterioare prin implementarea instrucțiunilor lipsă într-o bibliotecă software furnizată de sistemul de operare. Aceasta este invocată automat prin gestionarea excepțiilor atunci când sunt întâlnite instrucțiunile defecte, astfel încât programele care le folosesc să poată executa fără modificări pe mașinile mai noi.

Arhitectura Intel x86 acceptă un format BCD unic de 18 cifre (zece octeți) care poate fi încărcat și stocat din registrele în virgulă mobilă, de unde pot fi efectuate calcule.

Seria Motorola 68000 avea instrucțiuni BCD.

În computerele mai recente, astfel de capabilități sunt aproape întotdeauna implementate în software, mai degrabă decât setul de instrucțiuni al procesorului, dar datele numerice BCD sunt încă extrem de comune în aplicațiile comerciale și financiare. Există trucuri pentru implementarea operațiunilor de adăugare sau scădere zecimală împachetate BCD și zecimale folosind secvențe scurte, dar greu de înțeles de logică paralelă cuvânt și operații aritmetice binare. De exemplu, următorul cod (scris în C ) calculează o adăugare BCD ambalată de 8 cifre nesemnată utilizând operații binare pe 32 de biți:

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 în electronică

BCD este foarte frecvent în sistemele electronice în care urmează să fie afișată o valoare numerică, în special în sistemele constând exclusiv din logică digitală și care nu conțin un microprocesor. Prin utilizarea BCD, manipularea datelor numerice pentru afișare poate fi mult simplificată prin tratarea fiecărei cifre ca un sub-circuit separat. Acest lucru se potrivește mult mai strâns cu realitatea fizică a hardware-ului de afișare - un proiectant ar putea alege să folosească o serie de afișaje separate identice cu șapte segmente pentru a construi un circuit de măsurare, de exemplu. Dacă cantitatea numerică ar fi stocată și manipulată ca binar pur, interfața cu un astfel de afișaj ar necesita circuite complexe. Prin urmare, în cazurile în care calculele sunt relativ simple, lucrul în întregime cu BCD poate duce la un sistem general mai simplu decât conversia la și de la binar. Majoritatea calculatoarelor de buzunar își fac toate calculele în BCD.

Același argument se aplică atunci când hardware-ul de acest tip folosește un microcontroler încorporat sau alt procesor mic. Adesea, reprezentarea internă a numerelor în format BCD are ca rezultat un cod mai mic, deoarece o conversie din sau în reprezentare binară poate fi costisitoare pentru astfel de procesoare limitate. Pentru aceste aplicații, unele procesoare mici au moduri aritmetice dedicate, care ajută la scrierea rutinelor care manipulează cantitățile BCD.

Operațiuni cu BCD

Plus

Este posibil să efectuați adăugarea adăugând mai întâi în binar și apoi convertind în BCD după aceea. Conversia sumei simple a două cifre se poate face adăugând 6 (adică 16 - 10) atunci când rezultatul pe cinci biți al adăugării unei perechi de cifre are o valoare mai mare de 9. Motivul pentru care se adaugă 6 este că există 16 valori BCD posibile pe 4 biți (din moment ce 2 4 = 16), dar sunt valabile doar 10 valori (0000 până la 1001). De exemplu:

1001 + 1000 = 10001
   9 +    8 =    17

10001 este reprezentarea binară, nu zecimală, a rezultatului dorit, dar cel mai semnificativ 1 („transportul”) nu se poate încadra într-un număr binar de 4 biți. În BCD ca în zecimal, nu poate exista o valoare mai mare de 9 (1001) pe cifră. Pentru a corecta acest lucru, 6 (0110) este adăugat la total, iar apoi rezultatul este tratat ca două ronțăi:

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

Cele două ciuguliri ale rezultatului, 0001 și 0111, corespund cifrelor „1” și „7”. Acest lucru dă „17” în BCD, care este rezultatul corect.

Această tehnică poate fi extinsă la adăugarea mai multor cifre prin adăugarea în grupuri de la dreapta la stânga, propagarea celei de-a doua cifre ca transfer, comparând întotdeauna rezultatul de 5 biți al fiecărei sume de perechi de cifre cu 9. Unele procesoare oferă un semiport pentru a facilita ajustările aritmetice BCD în urma operațiilor de adunare și scădere binare. CPU Z80 oferă opcode DAA, Decimal Adjust Accumulator, DAA

Scădere

Scăderea se face prin adăugarea complementului celor zece ale subtrahendului la minuend . Pentru a reprezenta semnul unui număr în BCD, numărul 0000 este utilizat pentru a reprezenta un număr pozitiv , iar 1001 este utilizat pentru a reprezenta un număr negativ . Restul de 14 combinații sunt semne nevalide. Pentru a ilustra scăderea BCD semnată, luați în considerare următoarea problemă: 357 - 432.

În BCD semnat, 357 este 0000 0011 0101 0111. Complementul zecii de 432 poate fi obținut luând complementul celor nouă de 432 și apoi adăugând unul. Deci, 999 - 432 = 567 și 567 + 1 = 568. Prin precedarea lui 568 în BCD de codul semnului negativ, se poate reprezenta numărul −432. Deci, −432 în BCD semnat este 1001 0101 0110 1000.

Acum că ambele numere sunt reprezentate în BCD semnat, ele pot fi adăugate împreună:

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

Deoarece BCD este o formă de reprezentare zecimală, mai multe dintre sumele cifrelor de mai sus sunt nevalide. În cazul în care există o intrare nevalidă (orice cifră BCD mai mare de 1001), se adaugă 6 pentru a genera un bit de transport și a face ca suma să devină o intrare validă. Deci, adăugând 6 la intrările nevalide rezultă următoarele:

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

Astfel, rezultatul scăderii este 1001 1001 0010 0101 (−925). Pentru a confirma rezultatul, rețineți că prima cifră este 9, ceea ce înseamnă negativ. Acest lucru pare a fi corect, deoarece 357 - 432 ar trebui să conducă la un număr negativ. Resturile de ronțăit sunt BCD, deci 1001 0010 0101 este 925. Complementul celor zece de 925 este 1000 - 925 = 75, deci răspunsul calculat este −75.

Dacă se adaugă un număr diferit de ronțăituri (cum ar fi 1053 - 2), numărul cu cele mai puține cifre trebuie mai întâi să fie prefixat cu zerouri înainte de a lua complementul celor zece sau de a scădea. Deci, cu 1053-2, 2 ar trebui să fie mai întâi reprezentat ca 0002 în BCD, iar complementul zecii de 0002 ar trebui calculat.

Comparație cu binar pur

Avantaje

  • Multe valori neintegrale, cum ar fi zecimalul 0.2, au o reprezentare infinită a valorii de poziție în binar (.001100110011 ...), dar au o valoare de poziție finită în zecimal cu cod binar (0,0010). În consecință, un sistem bazat pe reprezentări zecimale codate binar ale fracțiilor zecimale evită erorile care reprezintă și calculează astfel de valori. Acest lucru este util în calculele financiare.
  • Scalarea cu o putere de 10 este simplă.
  • Rotunjirea la limita unei cifre zecimale este mai simplă. Adunarea și scăderea în zecimale nu necesită rotunjire.
  • Alinierea a două numere zecimale (de exemplu 1.3 + 27.08) este o schimbare simplă, exactă.
  • Conversia într-o formă de caractere sau pentru afișare (de exemplu, într-un format bazat pe text, cum ar fi XML sau pentru a conduce semnalele pentru un afișaj cu șapte segmente ) este o cartografiere simplă pe cifre și poate fi realizată liniar ( O ( n )) timp. Conversia din binar pur implică o logică relativ complexă care se întinde pe cifre, iar pentru numere mari nu se cunoaște niciun algoritm de conversie în timp liniar (a se vedea Sistemul numeric binar § Conversia către și din alte sisteme numerice ).

Dezavantaje

  • Unele operațiuni sunt mai complexe de implementat. Adăugătorii necesită o logică suplimentară pentru a-i determina să se încheie și să genereze un transport mai devreme. Este nevoie de 15 până la 20 la sută mai multe circuite pentru adăugarea BCD în comparație cu binarul pur. Multiplicarea necesită utilizarea algoritmilor care sunt oarecum mai complexi decât shift-mask-add ( este necesară o multiplicare binară , care necesită deplasări și adunări binare sau echivalentul, per cifră sau grup de cifre).
  • Standardul BCD necesită patru biți pe cifră, cu aproximativ 20% mai mult spațiu decât o codificare binară (raportul dintre 4 biți și log 2 10 biți este de 1,204). Când este împachetat astfel încât trei cifre să fie codificate în zece biți, cheltuielile de stocare sunt mult reduse, în detrimentul unei codificări care nu este aliniată cu limitele de octeți de 8 biți comune pe hardware-ul existent, rezultând implementări mai lente pe aceste sisteme.
  • Implementările practice existente ale BCD sunt de obicei mai lente decât operațiile pe reprezentări binare, în special pe sistemele încorporate, datorită suportului limitat al procesorului pentru operațiunile BCD native.

Variații reprezentative

Există diferite implementări BCD care utilizează alte reprezentări pentru numere. Calculatoarele programabile fabricate de Texas Instruments , Hewlett-Packard și alții folosesc de obicei un format BCD în virgulă mobilă , de obicei cu două sau trei cifre pentru exponentul (zecimal). Biții suplimentare ale digitul semn poate fi utilizat pentru a indica valori numerice speciale, cum ar fi infinit , underflow / preaplin și eroare (un afișaj care clipește).

Variante semnate

Valorile zecimale semnate pot fi reprezentate în mai multe moduri. COBOL limbaj de programare, de exemplu, cinci suporturi formate zecimale, clasificate ca fiind cu fiecare dintre ele codifică semnul numeric într - un mod diferit:

Tip Descriere Exemplu
Nesemnat Niciun semn de ronțăit F1 F2 F3
Trecere semnată (format canonic) Semnați ronțăit în ultimul octet (cel mai puțin semnificativ) F1 F2 C3
Leading semnat (overpunch) Semnați ronțăit în primul (cel mai semnificativ) octet C1 F2 F3
Semnat în urmă separat Separați octetul caracterului semnului ( '+'sau '−') urmând octeții cifrei F1 F2 F3 2B
Semnat de conducere separat Separați octetul caracterului semnului ( '+'sau '−') care precede octeții cifrei 2B F1 F2 F3

Zecimal codat binar pentru telefonie (TBCD)

3GPP a dezvoltat TBCD , o extindere la BCD în care combinațiile de biți rămași (neutilizați) sunt folosite pentru a adăuga caractere de telefonie specifice , cu cifre similare celor găsite în designul original al tastaturilor telefonice .


Cifră zecimală
TBCD
8 4 2 1
* 1 0 1 0
# 1 0 1 1
A 1 1 0 0
b 1 1 0 1
c 1 1 1 0
Folosit ca umplutură atunci când există un număr impar de cifre 1 1 1 1

Documentul 3GPP menționat definește TBCD-STRING cu nibbles schimbate în fiecare octet. Biți, octeți și cifre indexate de la 1, biți din dreapta, cifre și octeți din stânga.

biți 8765 de octet n cifră cifră 2 n

biți 4321 de octet n codificare cifră 2 ( n - 1) + 1

Adică număr 1234, ar deveni 21 43în TBCD.

Codificări alternative

Dacă erorile în reprezentare și calcul sunt mai importante decât viteza de conversie la și de la afișare, poate fi utilizată o reprezentare binară la scară, care stochează un număr zecimal ca un număr întreg codificat binar și un exponent zecimal semnat codat binar. De exemplu, 0,2 poate fi reprezentat ca 2 × 10 - 1 .

Această reprezentare permite multiplicarea și împărțirea rapidă, dar poate necesita deplasarea cu o putere de 10 în timpul adunării și scăderii pentru a alinia punctele zecimale. Este adecvat pentru aplicațiile cu un număr fix de zecimale care nu necesită această ajustare - în special aplicațiile financiare în care de obicei sunt suficiente 2 sau 4 cifre după punctul zecimal. Într-adevăr, aceasta este aproape o formă de aritmetică a punctului fix, deoarece poziția punctului radix este implicită.

De Hertz și Chen-Ho codificările oferă transformări Boolean pentru conversia grupuri de câte trei cifre codificate BCD și de la valori de 10 biți , care pot fi codificate în mod eficient în hardware - ul cu doar 2 sau 3 întârzieri poarta. Zecimalul ambalat dens (DPD) este o schemă similară care este utilizată pentru majoritatea semnificației , cu excepția cifrei de plumb, pentru una dintre cele două codificări zecimale alternative specificate în standardul IEEE 754-2008 în virgulă mobilă.

Cerere

BIOS - ul în mai multe calculatoare personale stochează data și ora în BCD deoarece MC6818 timp real cip ceas utilizat în original IBM PC la placa de baza cu condiția ca timpul codificat în BCD. Acest formular este ușor de convertit în ASCII pentru afișare.

Familia de 8-biți Atari de calculatoare utilizate BCD pentru a pune în aplicare algoritmi în virgulă mobilă. MOS 6502 Procesorul are un mod de BCD , care afectează instrucțiunile de adunare și scădere. Psion Organizator 1 software - ul furnizat-producătorul computerului portabil, de asemenea , utilizat în întregime BCD pentru a pune în aplicare în virgulă mobilă; mai târziu, modelele Psion au folosit binar exclusiv.

Primele modele de PlayStation 3 stochează data și ora în BCD. Acest lucru a dus la o întrerupere la nivel mondial a consolei la 1 martie 2010. Ultimele două cifre ale anului stocate ca BCD au fost interpretate greșit ca 16 provocând o eroare la data unității, făcând cele mai multe funcții inoperabile. Aceasta a fost denumită Problema Anului 2010 .

Istoria juridică

În cazul Gottschalk v. Benson din 1972 , Curtea Supremă a SUA a anulat decizia unei instanțe inferioare care a permis un brevet pentru convertirea numerelor codificate BCD în binare pe un computer. Decizia a menționat că un brevet „ar preveni în totalitate formula matematică și, în realitate, ar fi un brevet asupra algoritmului în sine”. Aceasta a fost o hotărâre reper care a determinat brevetabilitatea software-ului și algoritmilor.

Vezi si

Note

Referințe

Lecturi suplimentare

linkuri externe