Dziesiętny kodowany binarnie - Binary-coded decimal

Zegar binarny może użyć diody do wyrażania wartości binarnych. W tym zegarze każda kolumna diod LED pokazuje zakodowaną binarnie liczbę dziesiętną tradycyjnego czasu sześćdziesiętnego .

W systemach komputerowych i elektronicznych , dziesiętny kod binarny ( BCD ) jest klasą kodowania binarnego liczb dziesiętnych, gdzie każda cyfra jest reprezentowana przez stałą liczbę bitów , zwykle cztery lub osiem. Czasami dla znaku lub innych wskazań (np. błąd lub przepełnienie) używane są specjalne wzorce bitowe .

W systemach zorientowanych bajtowo (tj. w większości nowoczesnych komputerów), termin rozpakowany BCD zwykle oznacza pełny bajt dla każdej cyfry (często ze znakiem), podczas gdy spakowany BCD zazwyczaj koduje dwie cyfry w jednym bajcie, wykorzystując fakt, że cztery bity wystarczą, aby reprezentować zakres od 0 do 9. Dokładne kodowanie 4-bitowe może się jednak różnić z przyczyn technicznych (np. Nadmiar-3 ).

Dziesięć stanów reprezentujących cyfrę BCD jest czasami nazywanych tetradami (ponieważ skubać zwykle potrzebny do ich przechowywania jest również znany jako tetrada), podczas gdy nieużywane, nie obchodzi - stany są nazywane pseudo-tetrad(e)s  [ de ] , cyfry pseudodziesiętne lub cyfry pseudodziesiętne .

Główną zaletą BCD, w porównaniu z binarnymi systemami pozycyjnymi , jest dokładniejsze odwzorowanie i zaokrąglanie wartości dziesiętnych, a także łatwość konwersji na konwencjonalne reprezentacje czytelne dla człowieka. Jego główne wady to nieznaczny wzrost złożoności obwodów potrzebnych do implementacji podstawowej arytmetyki, a także nieco mniej gęste przechowywanie.

BCD był stosowany w wielu wczesnych komputerów po przecinku , a realizowany jest w zestaw instrukcji maszyn takich jak IBM System / 360 serii i jego potomkom, Digital Equipment Corporation „s VAX , w Burroughs B1700 i Motorola 68000 -series procesorów. BCD per se nie jest tak szeroko stosowany jak w przeszłości i nie jest już implementowany w zestawach instrukcji nowszych komputerów (np. ARM ); x86 nie obsługuje już swoich instrukcji BCD w trybie długim . Jednak formaty dziesiętne stałoprzecinkowe i zmiennoprzecinkowe są nadal ważne i nadal są używane w obliczeniach finansowych, komercyjnych i przemysłowych, gdzie nie można tolerować subtelnych błędów konwersji i zaokrąglania ułamków, które są nieodłączne w zmiennoprzecinkowych reprezentacjach binarnych.

Tło

BCD wykorzystuje fakt, że dowolna liczba dziesiętna może być reprezentowana przez czterobitowy wzór. Najbardziej oczywistym sposobem kodowania cyfr jest Natural BCD (NBCD), gdzie każda cyfra dziesiętna jest reprezentowana przez odpowiadającą jej czterobitową wartość binarną, jak pokazano w poniższej tabeli. Nazywa się to również kodowaniem „8421”.

Cyfra dziesiętna 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

Ten schemat może być również określany jako Simple Binary-Coded Decimal ( SBCD ) lub BCD 8421 i jest najbardziej powszechnym kodowaniem. Inne obejmują tak zwane kodowanie „4221” i „7421” – nazwane na podstawie ważenia użytego dla bitów – oraz „ Nadmiar-3 ”. Na przykład cyfra BCD 6, 0110'bw notacji 8421, jest 1100'bw 4221 (możliwe są dwa kodowania), 0110'bw 7421, podczas gdy w Nadmiarze-3 jest to 1001'b( ).

4-bitowe kody BCD i pseudo-tetrady
Fragment Waga  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15         Komentarz        
4 8 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 Dwójkowy
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
Nazwa 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Dziesiętny
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
Nadmiar-3 (XS-3) -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12
Nadmiar-6 (XS-6) -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9
Skok na 2 (2 4 2 1) 0 1             2 3 4 5 6 7 8 9
Skok na 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    
Biały (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
Taśma magnetyczna   1 2 3 4 5 6 7 8 9 0          
Paweł   1 3 2 6 7 5 4   0     8 9    
Szary 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
Klara 0 1   2     4 3 9 8   7     5 6
Piotra (RAE)   1 3 2   0 4     8 6 7   9 5  
O'Brien I (Waty) 0 1 3 2     4   9 8 6 7     5  
5-cykliczny 0 1 3 2     4   5 6 8 7     9  
Tompkinsa 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    
Nadmiar-3 szary -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  
Susskinda   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

Poniższa tabela przedstawia cyfry dziesiętne od 0 do 9 w różnych systemach kodowania BCD. W nagłówkach „ ” wskazuje wagę każdego bitu. W piątej kolumnie („BCD 8 4 -2 -1”) dwie wagi są ujemne. Wyświetlane są również kody znaków ASCII i EBCDIC dla cyfr, które są przykładami strefowego kodu BCD. 8421

 
Cyfra
KOZ
8 4 2 1
 Kod Stibitza lub Nadmiar-3 Kod Aiken lub 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

Ponieważ większość komputerów obsługuje dane w 8-bitowych bajtach , możliwe jest użycie jednej z następujących metod do zakodowania numeru BCD:

  • Rozpakowany : Każda cyfra dziesiętna jest zakodowana w jednym bajcie, przy czym cztery bity reprezentują liczbę, a pozostałe bity nie mają znaczenia.
  • Pakowane : Dwie cyfry dziesiętne są zakodowane w pojedynczym bajcie, z jedną cyfrą w najmniej znaczącym półbajtu ( bity od 0 do 3 ), a drugą cyfrą w najbardziej znaczącym półbajtem (bity od 4 do 7).

Na przykład zakodowanie liczby dziesiętnej 91przy użyciu rozpakowanego kodu BCD daje następujący binarny wzór dwóch bajtów:

Decimal:         9         1
Binary : 0000 1001 0000 0001

W spakowanym BCD ta sama liczba zmieściłaby się w jednym bajcie:

Decimal:   9    1
Binary: 1001 0001

Stąd zakres liczbowy dla jednego rozpakowanego bajtu BCD wynosi od zera do dziewięciu włącznie, podczas gdy zakres dla jednego spakowanego bajtu BCD wynosi od zera do dziewięćdziesięciu dziewięciu włącznie.

Do reprezentowania liczb większych niż zakres pojedynczego bajtu może być użyta dowolna liczba sąsiednich bajtów. Na przykład, aby przedstawić liczbę dziesiętną 12345w spakowanym BCD, używając formatu big-endian , program zakodowałby w następujący sposób:

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

Tutaj najbardziej znaczący kawałek najbardziej znaczącego bajtu został zakodowany jako zero, więc liczba jest przechowywana jako 012345(ale procedury formatowania mogą zastąpić lub usunąć wiodące zera). Spakowany BCD jest bardziej wydajny pod względem wykorzystania pamięci masowej niż rozpakowany BCD; zakodowanie tego samego numeru (z wiodącym zerem) w rozpakowanym formacie zużyłoby dwa razy więcej miejsca.

Operacje przesuwania i maskowania służą do pakowania lub rozpakowywania spakowanej cyfry BCD. Inne operacje bitowe służą do konwersji liczby na równoważny wzór bitowy lub odwrócenia procesu.

Pakowane BCD

W upakowanym BCD (lub po prostu upakowanym dziesiętnym ), każdy z dwóch półbajtów każdego bajtu reprezentuje cyfrę dziesiętną. Packed BCD jest używany od co najmniej lat 60. XX wieku i od tego czasu jest wdrażany we wszystkich komputerach mainframe IBM. Większość implementacji to big endian , tj. z bardziej znaczącą cyfrą w górnej połowie każdego bajtu iz skrajnie lewym bajtem (rezydującym pod najniższym adresem pamięci) zawierającym najbardziej znaczące cyfry upakowanej wartości dziesiętnej. Dolny półbajt bajtu z prawej strony jest zwykle używany jako flaga znaku, chociaż niektóre reprezentacje bez znaku nie mają flagi znaku. Na przykład, wartość 4-bajtowa składa się z 8 półbajtów, przy czym górne 7 półbajtów przechowuje cyfry 7-cyfrowej wartości dziesiętnej, a najniższy półbajt wskazuje znak dziesiętnej wartości całkowitej.

Standardowe wartości znaku to 1100 ( szesnastkowy C) dla dodatniego (+) i 1101 (D) dla ujemnego (-). Ta konwencja pochodzi z pola strefy dla znaków EBCDIC i podpisanej reprezentacji przebijania . Inne dozwolone znaki to 1010 (A) i 1110 (E) dla pozytywnych i 1011 (B) dla negatywnych. Procesory IBM System/360 będą używać znaków 1010 (A) i 1011 (B), jeśli bit A jest ustawiony w PSW, dla standardu ASCII-8, który nigdy nie przeszedł. Większość implementacji dostarcza również wartości BCD bez znaku ze znakiem nibble 1111 (F). ILE RPG używa 1111 (F) dla pozytywnego i 1101 (D) dla negatywnego. Są one zgodne ze strefą EBCDIC dla cyfr bez przebijania znaku. W upakowanym BCD liczba 127 jest reprezentowana przez 0001 0010 0111 1100 (127C), a -127 jest reprezentowana przez 0001 0010 0111 1101 (127D). Systemy Burroughsa używały 1101 (D) dla wartości ujemnych, a każda inna wartość jest uważana za wartość znaku dodatniego (procesory znormalizują znak dodatni do 1100 (C)).


Cyfra znaku
KOZ
8 4 2 1
Znak Uwagi
A 1 0 1 0 +  
b 1 0 1 1  
C 1 1 0 0 + Preferowane
D 1 1 0 1 Preferowane
mi 1 1 1 0 +  
F 1 1 1 1 + Niepodpisany

Bez względu na to, ile bajtów ma słowo , zawsze istnieje parzysta liczba półbajtów, ponieważ każdy bajt ma dwa z nich. Dlatego słowo n bajtów może zawierać do (2 n )-1 cyfr dziesiętnych, co jest zawsze nieparzystą liczbą cyfr. Liczba dziesiętna z d cyframi wymaga1/2( d +1) bajtów przestrzeni dyskowej.

Na przykład słowo 4-bajtowe (32-bitowe) może zawierać siedem cyfr dziesiętnych plus znak i może reprezentować wartości z zakresu ±99999999. Tak więc liczba -1 234 567 ma szerokość 7 cyfr i jest zakodowana jako:

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

Podobnie jak ciągi znaków, pierwszy bajt upakowanego miejsca dziesiętnego – ten z dwiema najbardziej znaczącymi cyframi – jest zwykle przechowywany pod najniższym adresem w pamięci, niezależnie od końca maszyny.

W przeciwieństwie do tego 4-bajtowa liczba całkowita dopełniająca do dwóch binarnych może reprezentować wartości od -2 147 483 648 do +2 147 483 647.

Podczas gdy spakowany BCD nie wykorzystuje optymalnie pamięci (używając około 20% więcej pamięci niż zapis binarny do przechowywania tych samych liczb), konwersja do ASCII , EBCDIC lub różnych kodowań Unicode jest trywialna, ponieważ nie są wymagane żadne operacje arytmetyczne. Dodatkowe wymagania dotyczące przechowywania są zwykle równoważone potrzebą dokładności i zgodności z kalkulatorem lub obliczeniami ręcznymi, które zapewnia arytmetyka dziesiętna z przecinkiem stałym. Istnieją gęstsze upakowania BCD , które pozwalają uniknąć kar za przechowywanie, a także nie wymagają operacji arytmetycznych dla typowych konwersji.

Packed BCD jest obsługiwany w języku programowania COBOL jako typ danych "COMPUTATIONAL-3" (rozszerzenie IBM przyjęte przez wielu innych dostawców kompilatorów) lub "PACKED-DECIMAL" (część standardu COBOL 1985). Jest obsługiwany w PL/I jako „STAŁY DZIESIĘTNY”. Poza komputerami mainframe IBM System/360 i nowszymi, pakiet BCD jest zaimplementowany w natywnym zestawie instrukcji oryginalnych procesorów VAX firmy Digital Equipment Corporation i niektórych modeli komputerów mainframe z serii SDS Sigma i jest formatem macierzystym dla Burroughs Corporation Medium Systems linia komputerów mainframe (wywodząca się z serii Electrodata 200 z lat 50. ).

Reprezentacje uzupełnienia do dziesięciu liczb ujemnych oferują alternatywne podejście do kodowania znaku upakowanych (i innych) liczb BCD. W tym przypadku liczby dodatnie zawsze mają najbardziej znaczącą cyfrę między 0 a 4 (włącznie), podczas gdy liczby ujemne są reprezentowane przez uzupełnienie dziesiątek odpowiedniej liczby dodatniej. W rezultacie system ten pozwala na 32-bitowe spakowane liczby BCD w zakresie od -50 000 000 do + 49 999 999, a -1 jest reprezentowane jako 99999999. (Podobnie jak w przypadku liczb binarnych z uzupełnieniem do dwóch, zakres nie jest symetryczny względem zera).

Stały punkt dziesiętny upakowany

Liczby dziesiętne stałopozycyjne są obsługiwane przez niektóre języki programowania (takie jak COBOL, PL/I i Ada ). Te języki pozwalają programiście określić niejawny przecinek dziesiętny przed jedną z cyfr. Na przykład upakowana wartość dziesiętna zakodowana za pomocą bajtów 12 34 56 7C reprezentuje wartość stałoprzecinkową +1,234,567, gdy domniemany przecinek dziesiętny znajduje się między czwartą a piątą cyfrą:

12 34 56 7C
12 34.56 7+

Przecinek dziesiętny nie jest w rzeczywistości przechowywany w pamięci, ponieważ format przechowywania spakowanego BCD go nie zapewnia. Jego lokalizacja jest po prostu znana kompilatorowi, a wygenerowany kod działa zgodnie z różnymi operacjami arytmetycznymi.

Kodowanie o większej gęstości

Jeśli cyfra dziesiętna wymaga czterech bitów, trzy cyfry dziesiętne wymagają 12 bitów. Ponieważ jednak 2 10 (1024) jest większe niż 10 3 (1 000), jeśli trzy cyfry dziesiętne są zakodowane razem, potrzeba tylko 10 bitów. Dwa takie kodowania to kodowanie Chen-Ho i gęsto upakowane dziesiętne (DPD). Ta ostatnia ma tę zaletę, że podzbiory kodowania kodują dwie cyfry w optymalnych siedmiu bitach i jedną cyfrę w czterech bitach, tak jak w zwykłym BCD.

Strefowy dziesiętny

Niektóre implementacje, na przykład systemy mainframe IBM , obsługują reprezentacje liczbowe w postaci dziesiętnych stref. Każda cyfra dziesiętna jest przechowywana w jednym bajcie, przy czym dolne cztery bity kodują cyfrę w postaci BCD. Cztery górne bity, zwane bitami „strefy”, są zwykle ustawione na stałą wartość, tak aby bajt zawierał wartość znakową odpowiadającą cyfrze. Systemy EBCDIC używają wartości strefy 1111 (hex F); daje to bajty z zakresu od F0 do F9 (szesnastkowe), które są kodami EBCDIC dla znaków od „0” do „9”. Podobnie systemy ASCII używają wartości strefy 0011 (hex 3), dając kody znaków od 30 do 39 (hex).

W przypadku wartości dziesiętnych strefowych ze znakiem, najbardziej na prawo (najmniej znaczący) półbajt strefy zawiera cyfrę znaku, która jest tym samym zestawem wartości, który jest używany dla upakowanych liczb dziesiętnych ze znakiem (patrz powyżej). Zatem wartość dziesiętna strefy zakodowana jako bajty szesnastkowe F1 F2 D3 reprezentuje wartość dziesiętną ze znakiem −123:

F1 F2 D3
1  2 −3

Tabela konwersji stref dziesiętnych EBCDIC

cyfra BCD Szesnastkowy Znak 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 E 4 F4 D ty U 4
5+ C5 A5 E5 F5 mi 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 tak Tak 8
9+ C9 A9 E9 F9 i 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     Q      
9− D9 B9     r      

(*) Uwaga: Te znaki różnią się w zależności od ustawienia lokalnej strony kodowej znaku .

Dziesiętny strefowy ze stałym punktem

Niektóre języki (takie jak COBOL i PL/I) bezpośrednio obsługują wartości dziesiętne strefowe ze stałym przecinkiem, przypisując niejawny przecinek dziesiętny w pewnym miejscu między cyframi dziesiętnymi liczby. Na przykład, biorąc pod uwagę sześciobajtową strefową wartość dziesiętną ze znakiem z domniemanym przecinkiem po prawej stronie czwartej cyfry, bajty szesnastkowe F1 F2 F7 F9 F5 C0 reprezentują wartość +1279,50:

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

BCD w komputerach

IBM

IBM użył terminów Binary-Coded Decimal Interchange Code (BCDIC, czasami nazywany po prostu BCD), dla 6-bitowych kodów alfanumerycznych , które reprezentują liczby, wielkie litery i znaki specjalne. Pewna odmiana alfameryki BCDIC jest używana w większości wczesnych komputerów IBM, w tym w IBM 1620 (wprowadzony w 1959), serii IBM 1400 i nie- dziesiętnych członkach architektury serii IBM 700/7000 .

Seria IBM 1400 to maszyny adresowane znakowo, gdzie każda lokalizacja składa się z sześciu bitów oznaczonych jako B, A, 8, 4, 2 i 1, plus bit kontroli nieparzystości ( C ) i bit znacznika słowa ( M ). W przypadku kodowania cyfr od 1 do 9 , B i A są zerowe, a wartość cyfrowa reprezentowana przez standardowy 4-bitowy kod BCD w bitach od 8 do 1 . Dla większości innych znaków bity B i A są wyprowadzane po prostu z "12", "11" i "0" "dziurkowania strefy" w kodzie znaków dziurkowanej karty , a bity od 8 do 1 od 1 do 9 stempli. Określenie "strefa 12" stempel ustawiony zarówno B i A , to "11" SET strefa B , a "0" strefy (A 0 stempel łączyć z innymi) zestaw . W ten sposób litera A , która jest (12,1) w formacie karty dziurkowanej, jest zakodowana (B,A,1) . Symbol waluty $ , (11,8,3) na karcie dziurkowanej został zakodowany w pamięci jako (B,8,2,1) . Pozwala to obwodom na bardzo prostą konwersję między formatem kart dziurkowanych a formatem pamięci wewnętrznej z kilkoma specjalnymi przypadkami. Ważnym szczególnym przypadkiem jest cyfra 0 , reprezentowana przez samotne 0 na karcie i (8,2) w pamięci rdzenia.

Pamięć IBM 1620 jest zorganizowana w 6-bitowe adresowalne cyfry, zwykle 8, 4, 2, 1 plus F , używane jako bit flagi i C , nieparzysty bit kontroli parzystości. Alfamery BCD są kodowane za pomocą par cyfr, przy czym „strefa” w adresie parzystym i „cyfra” w adresie nieparzystym, przy czym „strefa” odnosi się do „wykrojów strefy” 12 , 11 i 0 jako w serii 1400. Sprzęt do translacji wejścia/wyjścia konwertowany między wewnętrznymi parami cyfr a zewnętrznymi standardowymi 6-bitowymi kodami BCD.

W architekturze dziesiętnej IBM 7070 , IBM 7072 i IBM 7074 alfamery są kodowane za pomocą par cyfr (przy użyciu dwóch z pięciu kodu w cyfrach, a nie BCD) 10-cyfrowego słowa, z „strefą” w lewa cyfra i „cyfra” w prawej cyfrze. Sprzęt do translacji wejścia/wyjścia konwertowany między wewnętrznymi parami cyfr a zewnętrznymi standardowymi 6-bitowymi kodami BCD.

Wraz z wprowadzeniem System/360 , IBM rozszerzył 6-bitową alfamerykę BCD do 8-bitowego EBCDIC, umożliwiając dodawanie znacznie większej liczby znaków (np. małych liter). Zaimplementowany jest również numeryczny typ danych spakowanych BCD o zmiennej długości , zapewniający instrukcje maszynowe, które wykonują operacje arytmetyczne bezpośrednio na upakowanych danych dziesiętnych.

W IBM 1130 i 1800 spakowany BCD jest obsługiwany w oprogramowaniu przez IBM Commercial Subroutine Package.

Obecnie dane BCD są nadal intensywnie wykorzystywane w procesorach i bazach danych IBM , takich jak IBM DB2 , mainframes i Power6 . W tych produktach kod BCD jest zwykle strefowym kodem BCD (jak EBCDIC lub ASCII), pakietem BCD (dwie cyfry dziesiętne na bajt) lub „czystym” kodowaniem BCD (jedna cyfra dziesiętna przechowywana jako BCD w czterech najniższych bitach każdego bajtu) . Wszystkie z nich są używane w rejestrach sprzętowych i jednostkach przetwarzania oraz w oprogramowaniu. Aby przekonwertować upakowane liczby dziesiętne w wyładowaniach tabeli EBCDIC na czytelne liczby, można użyć maski OUTREC FIELDS narzędzia JCL DFSORT.

Inne komputery

Seria Digital Equipment Corporation VAX-11 zawiera instrukcje, które mogą wykonywać operacje arytmetyczne bezpośrednio na spakowanych danych BCD i konwertować między spakowanymi danymi BCD a innymi reprezentacjami liczb całkowitych. Spakowany format BCD VAX jest zgodny z formatem IBM System/360 i nowszych kompatybilnych procesorów IBM. Implementacje MicroVAX i późniejsze VAX zrezygnowały z tej możliwości z procesora, ale zachowały kompatybilność kodu z wcześniejszymi maszynami, implementując brakujące instrukcje w bibliotece oprogramowania dostarczanej przez system operacyjny. Jest to wywoływane automatycznie przez obsługę wyjątków w przypadku napotkania niefunkcjonujących instrukcji, dzięki czemu programy korzystające z nich mogą być wykonywane bez modyfikacji na nowszych komputerach.

Architektura Intel x86 obsługuje unikalny 18-cyfrowy (dziesięciobajtowy) format BCD, który można ładować i przechowywać z rejestrów zmiennoprzecinkowych, z których można wykonywać obliczenia.

Seria Motorola 68000 miała instrukcje BCD.

W nowszych komputerach takie możliwości są prawie zawsze implementowane w oprogramowaniu, a nie w zestawie instrukcji procesora, ale dane numeryczne BCD są nadal niezwykle powszechne w zastosowaniach komercyjnych i finansowych. Istnieją triki implementujące operacje dodawania lub odejmowania w upakowanych BCD i dziesiętnych w strefach przy użyciu krótkich, ale trudnych do zrozumienia sekwencji logiki równoległości wyrazów i binarnych operacji arytmetycznych. Na przykład poniższy kod (napisany w C ) oblicza niepodpisane 8-cyfrowe spakowane dodawanie BCD przy użyciu 32-bitowych operacji binarnych:

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 w elektronice

BCD jest bardzo powszechny w systemach elektronicznych, w których ma być wyświetlana wartość liczbowa, zwłaszcza w systemach składających się wyłącznie z logiki cyfrowej i niezawierających mikroprocesora. Dzięki zastosowaniu BCD można znacznie uprościć manipulację danymi numerycznymi do wyświetlenia, traktując każdą cyfrę jako oddzielny pojedynczy obwód podrzędny. To znacznie bardziej pasuje do fizycznej rzeczywistości sprzętu wyświetlającego — projektant może na przykład zdecydować się na użycie serii oddzielnych identycznych siedmiosegmentowych wyświetlaczy do zbudowania obwodu pomiarowego. Gdyby wielkość liczbowa była przechowywana i manipulowana jako czysto binarna, połączenie z takim wyświetlaczem wymagałoby skomplikowanych obwodów. Dlatego w przypadkach, w których obliczenia są stosunkowo proste, praca z BCD może prowadzić do ogólnie prostszego systemu niż konwersja do iz binarnych. Większość kalkulatorów kieszonkowych wykonuje wszystkie obliczenia w BCD.

Ten sam argument ma zastosowanie, gdy sprzęt tego typu wykorzystuje wbudowany mikrokontroler lub inny mały procesor. Często reprezentowanie liczb wewnętrznie w formacie BCD skutkuje mniejszym kodem, ponieważ konwersja z lub do reprezentacji binarnej może być kosztowna na tak ograniczonych procesorach. Dla tych aplikacji niektóre małe procesory posiadają dedykowane tryby arytmetyczne, które pomagają podczas pisania procedur manipulujących wielkościami BCD.

Operacje z BCD

Dodatek

Możliwe jest wykonanie dodawania , najpierw dodając w formacie binarnym, a następnie konwertując na BCD. Konwersji prostej sumy dwóch cyfr można dokonać dodając 6 (czyli 16-10), gdy pięciobitowy wynik dodawania pary cyfr ma wartość większą niż 9. Powodem dodawania 6 jest to, że 16 możliwych 4-bitowych wartości BCD (od 2 4 = 16), ale tylko 10 wartości jest prawidłowych (od 0000 do 1001). Na przykład:

1001 + 1000 = 10001
   9 +    8 =    17

10001 jest binarną, a nie dziesiętną reprezentacją pożądanego wyniku, ale najbardziej znacząca 1 („carry”) nie może zmieścić się w 4-bitowej liczbie binarnej. W BCD, tak jak w systemie dziesiętnym, nie może istnieć wartość większa niż 9 (1001) na cyfrę. Aby to poprawić, do sumy dodaje się 6 (0110), a następnie wynik jest traktowany jako dwa skubnięcia:

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

Dwie części wyniku, 0001 i 0111, odpowiadają cyfrom „1” i „7”. Daje to "17" w BCD, co jest poprawnym wynikiem.

Ta technika może zostać rozszerzona o dodawanie wielu cyfr poprzez dodawanie grup od prawej do lewej, propagując drugą cyfrę jako przeniesienie, zawsze porównując 5-bitowy wynik każdej sumy par cyfr z 9. Niektóre procesory zapewniają flagę half-carry aby ułatwić korekty arytmetyczne BCD po binarnych operacjach dodawania i odejmowania. Procesor Z80 zapewnia opcode DAA, akumulator z regulacją dziesiętną, DAA;

Odejmowanie

Odejmowanie odbywa się poprzez dodanie uzupełnienia dziesiątki odjemnej do odjemnej . Aby przedstawić znak liczby w BCD, liczba 0000 jest używana do reprezentowania liczby dodatniej , a 1001 jest używana do reprezentowania liczby ujemnej . Pozostałe 14 kombinacji to znaki nieprawidłowe. Aby zilustrować odejmowanie ze znakiem BCD, rozważmy następujący problem: 357 - 432.

W BCD ze znakiem 357 to 0000 0011 0101 0111. Uzupełnienie do dziesiątki 432 można uzyskać, biorąc uzupełnienie do dziewiątki z 432, a następnie dodając jeden. Tak więc 999 - 432 = 567 i 567 + 1 = 568. Poprzedzając 568 w BCD kodem znaku ujemnego, można przedstawić liczbę -432. Tak więc -432 w podpisanym BCD to 1001 0101 0110 1000.

Teraz, gdy obie liczby są reprezentowane w podpisanym BCD, można je dodać razem:

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

Ponieważ BCD jest formą reprezentacji dziesiętnej, kilka z powyższych sum cyfr jest nieprawidłowych. W przypadku, gdy istnieje nieprawidłowy wpis (dowolna cyfra BCD większa niż 1001), dodaje się 6, aby wygenerować bit przeniesienia i spowodować, że suma stanie się prawidłowym wpisem. Tak więc dodanie 6 do nieprawidłowych wpisów daje następujące wyniki:

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

Wynik odejmowania to 1001 1001 0010 0101 (−925). Aby potwierdzić wynik, zwróć uwagę, że pierwsza cyfra to 9, co oznacza ujemną. Wydaje się to być poprawne, ponieważ 357-432 powinno dać liczbę ujemną. Pozostałe kęsy to BCD, więc 1001 0010 0101 to 925. Dopełnienie dziesiątki 925 to 1000 − 925 = 75, więc obliczona odpowiedź to -75.

Jeśli dodawana jest inna liczba półbajtów (np. 1053 - 2), liczba z mniejszą liczbą cyfr musi najpierw zostać poprzedzona zerami przed wzięciem dopełnienia do dziesiątki lub odjęciem. Tak więc, przy 1053 − 2, 2 musiałoby być najpierw reprezentowane jako 0002 w BCD, a uzupełnienie dziesiątki do 0002 musiałoby zostać obliczone.

Porównanie z czystym binarnym

Zalety

  • Wiele wartości niecałkowitych, takich jak dziesiętne 0,2, ma nieskończoną reprezentację wartości miejsca w postaci binarnej (0.001100110011...), ale ma skończoną wartość miejsca w postaci dziesiętnej z kodem binarnym (0,0010). W rezultacie system oparty na kodowanych binarnie reprezentacjach dziesiętnych ułamków dziesiętnych pozwala uniknąć błędów przedstawiania i obliczania takich wartości. Jest to przydatne w obliczeniach finansowych.
  • Skalowanie przez potęgę 10 jest proste.
  • Zaokrąglanie na granicy cyfr dziesiętnych jest prostsze. Dodawanie i odejmowanie dziesiętne nie wymagają zaokrąglania.
  • Wyrównanie dwóch liczb dziesiętnych (na przykład 1,3 + 27,08) to proste, dokładne przesunięcie.
  • Konwersja do postaci znakowej lub do wyświetlania (np. do formatu tekstowego, takiego jak XML , lub do sterowania sygnałami dla wyświetlacza siedmiosegmentowego ) jest prostym mapowaniem na cyfry i może być wykonana liniowo ( O ( n )) czas. Konwersja z czystego binarnego obejmuje stosunkowo złożoną logikę, która obejmuje cyfry, a dla dużych liczb nie jest znany algorytm konwersji w czasie liniowym (patrz Binarny system liczbowy § Konwersja do iz innych systemów liczbowych ).

Niedogodności

  • Niektóre operacje są bardziej złożone do wdrożenia. Sumatory wymagają dodatkowej logiki, aby spowodować wcześniejsze zawinięcie i wygenerowanie przeniesienia. Do dodania BCD potrzeba od 15 do 20 procent więcej obwodów w porównaniu z czystym układem binarnym. Mnożenie wymaga użycia algorytmów, które są nieco bardziej złożone niż dodawanie maski z przesunięciem ( wymagane jest mnożenie binarne , wymagające przesunięć binarnych i dodawania lub równoważne, na cyfrę lub grupę cyfr).
  • Standardowy kod BCD wymaga czterech bitów na cyfrę, około 20 procent więcej miejsca niż kodowanie binarne (stosunek 4 bitów do log 2 10 bitów wynosi 1,204). Po spakowaniu w taki sposób, że trzy cyfry są zakodowane w dziesięciu bitach, obciążenie pamięci masowej jest znacznie zmniejszone, kosztem kodowania, które nie jest wyrównane z ośmiobitowymi granicami bajtów powszechnymi na istniejącym sprzęcie, co skutkuje wolniejszymi implementacjami w tych systemach.
  • Praktycznie istniejące implementacje BCD są zwykle wolniejsze niż operacje na reprezentacjach binarnych, zwłaszcza w systemach wbudowanych, ze względu na ograniczoną obsługę procesora dla natywnych operacji BCD.

Reprezentacyjne odmiany

Istnieją różne implementacje BCD, które wykorzystują inne reprezentacje liczb. Kalkulatory programowalne produkowane przez Texas Instruments , Hewlett-Packard i inne zazwyczaj wykorzystują zmiennoprzecinkowy format BCD, zwykle z dwiema lub trzema cyframi dla wykładnika (dziesiętnego). Dodatkowe bity cyfry znaku mogą być użyte do wskazania specjalnych wartości numerycznych, takich jak nieskończoność , niedomiar / przepełnienie i błąd (migający wyświetlacz).

Podpisane odmiany

Wartości dziesiętne ze znakiem mogą być reprezentowane na kilka sposobów. Na przykład język programowania COBOL obsługuje pięć strefowych formatów dziesiętnych, z których każdy koduje znak numeryczny w inny sposób:

Rodzaj Opis Przykład
Niepodpisany Brak znaku skubać F1 F2 F3
Podpisany koniec (format kanoniczny) Podpisz skubnięcie w ostatnim (najmniej znaczącym) bajcie F1 F2 C3
Podpisany wiodący (overpunch) Podpisz skubnięcie w pierwszym (najbardziej znaczącym) bajcie C1 F2 F3
Podpisany koniec oddzielnie Oddzielny bajt znaku ( '+'lub '−') po cyfrze bajtów F1 F2 F3 2B
Podpisany wiodący oddzielny Oddzielny bajt znaku znaku ( '+'lub '−') poprzedzający bajty cyfry 2B F1 F2 F3

Telefonia dziesiętna kodowana binarnie (TBCD)

3GPP opracowało TBCD , rozszerzenie do BCD, w którym pozostałe (nieużywane) kombinacje bitów są używane do dodawania określonych znaków telefonicznych , z cyframi podobnymi do tych, które można znaleźć w oryginalnych projektach klawiatur telefonicznych .


Cyfra dziesiętna
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
Używany jako wypełniacz, gdy liczba cyfr jest nieparzysta 1 1 1 1

Wspomniany dokument 3GPP definiuje TBCD-STRING z zamienionymi półbajtami w każdym bajcie. Bity, oktety i cyfry indeksowane od 1, bity od prawej, cyfry i oktety od lewej.

bity 8765 oktetu n kodujące cyfrę 2 n

bity 4321 oktetu n kodujące cyfrę 2( n – 1) + 1

Znaczenie numer 1234, stanie się 21 43w TBCD.

Alternatywne kodowania

Jeśli błędy w reprezentacji i obliczeniach są ważniejsze niż szybkość konwersji do iz wyświetlacza, można użyć skalowanej reprezentacji binarnej, która przechowuje liczbę dziesiętną jako liczbę całkowitą zakodowaną binarnie i wykładnik dziesiętny ze znakiem zakodowany binarnie. Na przykład 0,2 może być reprezentowane jako 2 × 10 1 .

Ta reprezentacja umożliwia szybkie mnożenie i dzielenie, ale może wymagać przesunięcia o potęgę 10 podczas dodawania i odejmowania w celu wyrównania miejsc dziesiętnych. Jest odpowiedni dla aplikacji ze stałą liczbą miejsc dziesiętnych, które nie wymagają tego dostosowania — szczególnie w aplikacjach finansowych, w których zwykle wystarczą 2 lub 4 cyfry po przecinku. Rzeczywiście, jest to prawie forma arytmetyki stałoprzecinkowej, ponieważ położenie punktu podstawy jest implikowane.

W Hertz i Chen-Ho kodowania zapewniają logicznych przekształceń dla przekształcenia grup trzech cyfr w kodzie BCD zakodowanego oraz z wartości 10-bitowej, który może być wydajnie zakodowane w sprzęcie tylko 2 lub 3 opóźnienia bramy. Densely upakowany dziesiętny (DPD) jest podobnym schematem, który jest używany dla większości significand , z wyjątkiem cyfry wiodącej, dla jednego z dwóch alternatywnych kodowań dziesiętnych określonych w standardzie zmiennoprzecinkowym IEEE 754-2008 .

Podanie

BIOS w wielu komputerów osobistych sklepach data i godzina w BCD, ponieważ MC6818 układ zegara czasu rzeczywistego używany w oryginalnym IBM PC AT płyty głównej pod warunkiem, że czas zakodowany w BCD. Ten formularz można łatwo przekształcić w ASCII w celu wyświetlenia.

Atari 8-bit rodzina komputerów wykorzystywane BCD wdrożenie algorytmów zmiennoprzecinkowych. 6502 MOS Procesor posiada tryb BCD, która wpływa na instrukcje dodawania i odejmowania. Przez Psion Organizer 1 oprogramowanie dostarczone przez producenta komputera podręcznego jest również w całości wykorzystywane BCD do wdrożenia zmiennoprzecinkowych; późniejsze modele Psion wykorzystywały wyłącznie binarne.

Wczesne modele PlayStation 3 przechowują datę i godzinę w BCD. Doprowadziło to do ogólnoświatowej awarii konsoli w dniu 1 marca 2010 roku. Ostatnie dwie cyfry roku przechowywane jako BCD zostały błędnie zinterpretowane jako 16, powodując błąd w dacie urządzenia, uniemożliwiając działanie większości funkcji. Zostało to nazwane Problemem Roku 2010 .

Historia prawna

W 1972 case Gottschalk v. Benson The Sąd Najwyższy USA uchylił niższej instancji decyzji, jakoby dopuścił do patentu do konwersji liczb BCD zakodowany na binarny na komputerze. W decyzji zauważono, że patent „całkowicie wykluczyłby formułę matematyczną iw praktyce byłby patentem na sam algorytm ”. To był przełomowy wyrok, który określał zdolność patentową oprogramowania i algorytmów.

Zobacz też

Uwagi

Bibliografia

Dalsza lektura

Zewnętrzne linki