Introduzione al Codice BCD

Concetti Chiave
  • Il codice BCD (Binary Coded Decimal) rappresenta i numeri decimali utilizzando sequenze di bit.
  • Ogni cifra decimale è rappresentata da una combinazione di 4 bit, permettendo di codificare le cifre da 0 a 9.
  • Le operazioni aritmetiche in BCD, come l'addizione, richiedono una correzione quando la somma supera 9, aggiungendo 6 (0110 in binario) per ottenere il risultato corretto.
  • Il codice BCD può essere utilizzato anche per rappresentare numeri decimali con segno, utilizzando il sistema segno-complemento.

Codice Binary Coded Decimal - BCD

Anche se il sistema numerico binario è il sistema più naturale per un computer perché è prontamente rappresentato nella tecnologia elettronica di oggi, la maggior parte delle persone è più abituata al sistema decimale.

Un modo per risolvere questa differenza è convertire i numeri decimali in binario, eseguire tutti i calcoli aritmetici in binario, e poi convertire i risultati binari di nuovo in decimale. Questo metodo richiede di memorizzare i numeri decimali nel computer in modo che possano essere convertiti in binario.

Poiché il computer può accettare solo valori binari, dobbiamo rappresentare le cifre decimali per mezzo di un codice che contiene 1 e 0. È anche possibile eseguire le operazioni aritmetiche direttamente sui numeri decimali quando sono memorizzati nel computer in forma codificata.

Un codice binario avrà alcune combinazioni di bit non assegnate se il numero di elementi nell'insieme non è una potenza multipla di 2. Le 10 cifre decimali formano tale insieme. Un codice binario che distingue tra 10 elementi deve contenere almeno quattro bit, ma 6 delle 16 combinazioni possibili rimangono non assegnate. Codici binari diversi possono essere ottenuti disponendo quattro bit in 10 combinazioni distinte. Il codice più comunemente usato per le cifre decimali è l'assegnazione binaria diretta elencata nella tabella seguente. Questo schema è chiamato Binary Coded Decimal viene comunemente indicato come BCD. Altri codici decimali sono possibili e alcuni di essi sono presentati nelle prossime lezioni.

Simbolo Decimale Cifra BCD
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
Tabella 1: Cifre decimali rappresentate nel codice BCD

La tabella di sopra fornisce il codice a quattro bit per ogni cifra decimale. Un numero con k cifre decimali richiederà 4\cdot k bit in BCD.

Ad esempio, volendo rappresentare il numero decimale 396 in BCD, dato che è composto da 3 cifre risulta necessario usare 12 bit in questo modo:

\begin{array}{ccc} 3 & 9 & 6 \\ 0011 & 1001 & 0110 \end{array}

Come si può osservare ogni gruppo di quattro bit rappresenta una cifra decimale. Un numero decimale in BCD è uguale al suo numero binario equivalente solo quando il numero è tra 0 e 9. Un numero BCD maggiore di 10 appare diverso dal suo numero binario equivalente, anche se entrambi contengono 1 e 0. Inoltre, le combinazioni binarie da 1010 a 1111 non sono usate e non hanno significato in BCD.

Consideriamo un altro esempio: il decimale 185 e il suo valore corrispondente in BCD e binario:

\begin{array}{ccc} 1 & 8 & 5 \\ 0001 & 1000 & 0101 \\ & 10111001 & \end{array}
(185)_{10} = (0001\; 1000\; 0101)_{\text{BCD}} = (10111001)_2

Il valore BCD ha 12 bit per codificare i caratteri del valore decimale, ma il numero binario equivalente ha bisogno solo di 8 bit. È ovvio che la rappresentazione di un numero BCD ha bisogno di più bit del suo valore binario equivalente. Tuttavia, c'è un vantaggio nell'uso dei numeri decimali, perché i dati di input e output del computer sono generati da persone che usano il sistema decimale.

È importante rendersi conto che i numeri BCD sono numeri decimali e non numeri binari, anche se usano bit nella loro rappresentazione. L'unica differenza tra un numero decimale e BCD è che i decimali sono scritti con i simboli 0, 1, 2, ..., 9, e i numeri BCD usano il codice binario 0000, 0001, 0010, ..., 1001. Il valore decimale è esattamente lo stesso. Il decimale 10 è rappresentato in BCD con otto bit come 0001 0000 e il decimale 15 come 0001 0101. I valori binari corrispondenti sono 1010 e 1111 e hanno solo quattro bit.

Concludiamo con un altro esempio. Trasformiamo in BCD il numero decimale 84:

\begin{array}{cc} 8 & 4 \\ 1000 & 0100 \\ \end{array}

Addizione BCD

Consideriamo l'addizione di due cifre decimali in BCD, insieme a un possibile riporto da una coppia precedente di cifre meno significative.

Poiché ogni cifra non supera 9, la somma non può essere maggiore di 9 + 9 + 1 = 19, con 1 che è un riporto precedente. Supponiamo di addizionare le cifre BCD come se fossero numeri binari. Allora la somma binaria produrrà un risultato nell'intervallo da 0 a 19. In binario, questo intervallo sarà da 0000 a 10011, ma in BCD, è da 0000 a 11001, con il primo (cioè, più a sinistra) 1 che è un riporto e i prossimi quattro bit che sono la somma BCD. Quando la somma binaria è uguale o minore di 1001 (senza riporto), la cifra BCD corrispondente è corretta. Tuttavia, quando la somma binaria è maggiore o uguale a 1010, il risultato è una cifra BCD non valida. L'addizione di 6 = (0110)_2 alla somma binaria la converte nella cifra corretta e produce anche un riporto come richiesto. Questo perché un riporto nella posizione del bit più significativo della somma binaria e un riporto decimale differiscono di 16 - 10 = 6.

Consideriamo le seguenti tre addizioni BCD:

  1. Sommiamo 4 e 5:

    \begin{array}{rrr} 4 & 0100 & + \\ 5 & 0101 & = \\ \hline 9 & 1001 & \end{array}

    In questo caso il risultato è corretto ed è una valida cifra BCD: 9 = (1001)_2.

  2. Adesso sommiamo 4 e 8:

    \begin{array}{rrr} 4 & 0100 & + \\ 8 & 1000 & = \\ \hline 12 & 1100 & \end{array}

    In questo caso, invece, il risultato non è una cifra BCD valida perché è maggiore di (1001)_2. Come si può fare per ottenere il risultato corretto? La risposta è molto semplice: basta sommare al risultato il numero 6 (in binario):

    \begin{array}{rrrr} 12 & & 1100 & + \\ 6 & & 0110 & = \\ \hline & 1 & 0010 & \end{array}

    Adesso abbiamo ottenuto un numero composto da 5 bit. I quattro bit meno significativi (0010)_2 = 2 rappresentano la cifra BCD corretta della somma di 4 e 8, mentre il quinto bit, quello più significativo, rappresenta il riporto.

  3. Sommiamo 8 e 9:

    \begin{array}{rrrr} 8 & & 1000 & + \\ 9 & & 1001 & = \\ \hline 17 & 1 & 0001 & + \\ & & 0110 & = \\ \hline & 1 & 0111 & \end{array}

    Anche in questo caso, sommando 6 al risultato dell'operazione, abbiamo ottenuto un bit di riporto e quattro bit che rappresentano la cifra unità della somma di 8 e 9, ossia (0111)_2 = 7.

In ogni caso, le due cifre BCD sono addizionate come se fossero due numeri binari. Se la somma binaria è maggiore o uguale a 1010, ossia 10, aggiungiamo 0110, ossia 6, per ottenere la somma BCD corretta e un riporto. Nel primo esempio, la somma è uguale a 9 ed è la somma BCD corretta. Nel secondo esempio, la somma binaria produce una cifra BCD non valida (1100). L'addizione di 0110 produce la somma BCD corretta, 0010 (cioè, il numero 2), e un riporto. Nel terzo esempio, la somma binaria (10001) produce un riporto. Questa condizione si verifica quando la somma è maggiore o uguale a 16. Anche se gli altri quattro bit sono meno di 1001, la somma binaria richiede una correzione a causa del riporto. Aggiungendo 0110, otteniamo la somma BCD richiesta 0111 (cioè, il numero 7) e un riporto BCD.

L'addizione di due numeri BCD senza segno a n cifre segue la stessa procedura. Consideriamo l'addizione di 184 + 576 = 760 in BCD:

\begin{array}{rrrcrrrr} 1 & 8 & 4 & & 0001 & 1000 & 0100 & + \\ 5 & 7 & 6 & & 0101 & 0111 & 0110 & = \\ \hline \end{array}

Per eseguire questa somma, dapprima sommiamo le cifre meno significative, 4 e 6:

\begin{array}{rrr} 4 & 0100 & + \\ 6 & 0110 & = \\ \hline 10 & 1010 & + \\ & 0110 & = \\ \hline & 10000 & \end{array}

La prima coppia meno significativa di cifre BCD produce una somma pari a 10 = (1010)_2 alla quale, dato che si tratta di una cifra BCD non valida, sommiamo (0110)_2 per ottenere la cifra valida e il riporto: 1 \, 0000.

Riportiamo sia la cifra che il riporto nella somma totale:

\begin{array}{rrrcrrrr} & & & & & 1 & & \\ 1 & 8 & 4 & & 0001 & 1000 & 0100 & + \\ 5 & 7 & 6 & & 0101 & 0111 & 0110 & = \\ \hline & & 0 & & & & 0000 & \end{array}

Adesso sommiamo la seconda coppia di cifre, 8 e 7, tenendo conto anche del riporto:

\begin{array}{rrr} \text{riporto} & 1 & + \\ 8 & 1000 & + \\ 7 & 0111 & = \\ \hline 16 \geq 10 & 10000 & + \\ \text{correzione} & 0110 & = \\ \hline & 10110 & \end{array}

Anche in questo caso abbiamo ottenuto una somma maggiore di (1010)_2 = 10, ossia (10000)_2 = 16. Per cui sommiamo il valore correttivo di (0110)_2 = 6 per ottenere la cifra e il riporto:

1 \quad 0110

Riportiamo nuovamente queste informazioni nella somma totale:

\begin{array}{rrrcrrrr} & & & & 1 & 1 & & \\ 1 & 8 & 4 & & 0001 & 1000 & 0100 & + \\ 5 & 7 & 6 & & 0101 & 0111 & 0110 & = \\ \hline & 6 & 0 & & & 0110 & 0000 & \end{array}

Manca la somma dell'ultima coppia di cifre, 1 e 5, a cui dobbiamo aggiungere anche il riporto:

\begin{array}{rrr} \text{riporto} & 1 & + \\ 1 & 0001 & + \\ 5 & 0101 & = \\ \hline 7 & 0111 & \end{array}

Il risultato che abbiamo ottenuto è minore di (1010)_2 quindi non necessita di correzione. Concludiamo, quindi, la somma:

\begin{array}{rrrcrrrr} & & & & 1 & 1 & & \\ 1 & 8 & 4 & & 0001 & 1000 & 0100 & + \\ 5 & 7 & 6 & & 0101 & 0111 & 0110 & = \\ \hline 7 & 6 & 0 & & 0111 & 0110 & 0000 & \end{array}

Aritmetica BCD

La rappresentazione di numeri decimali con segno in BCD è simile alla rappresentazione di numeri con segno in binario. Possiamo usare o il sistema familiare segno-modulo o il sistema segno-complemento. Il segno di un numero decimale è solitamente rappresentato con quattro bit per conformarsi al codice a quattro bit delle cifre decimali. È consuetudine designare un più con quattro 0 e un meno con l'equivalente BCD di 9, che è 1001.

Il sistema segno-modulo è raramente usato nei computer. Il sistema segno-complemento può essere o il complemento a 9 o a 10, ma il complemento a 10 è quello più usato. Per ottenere il complemento a 10 di un numero BCD, prima prendiamo il complemento a 9 e poi aggiungiamo 1 alla cifra meno significativa. Il complemento a 9 è calcolato dalla sottrazione di ogni cifra da 9.

Le procedure sviluppate per il sistema complemento a 2 con segno nelle lezioni precedenti si applicano anche al sistema complemento a 10 con segno per i numeri decimali. L'addizione è fatta sommando tutte le cifre, inclusa la cifra del segno, e scartando il riporto finale. Questa operazione assume che tutti i numeri negativi siano in forma complemento a 10.

Consideriamo, ad esempio, l'addizione (+375) + (-240) = +135, fatta nel sistema segno-complemento:

\begin{array}{cc} 0 & 375 \\ +9 & 760 \\ \hline 0 & 135 \end{array}

Il 9 nella posizione più a sinistra del secondo numero rappresenta un meno, e 9760 è il complemento a 10 di 0240. I due numeri sono addizionati e il riporto finale è scartato per ottenere +135. Naturalmente, i numeri decimali dentro il computer, incluse le cifre del segno, devono essere in BCD. L'addizione è fatta con cifre BCD come descritto precedentemente.

Vediamo qualche altro esempio pratico.

Esempio

Sommare in BCD i numeri 370 e -250.

  1. Per prima cosa effettuiamo il complemento a 10 di -250:

    \begin{array}{rrrrr} 9 & 9 & 9 & 9 & - \\ & 2 & 5 & 0 & = \\ \hline 9 & 7 & 4 & 9 & + \\ & & & 1 & = \\ \hline 9 & 7 & 5 & 0 \\ \end{array}
  2. Adesso sommiamo 370 e il complemento a 10 di -250:

    \begin{array}{rrrrrr} & 0 & 3 & 7 & 0 & + \\ & 9 & 7 & 5 & 0 & = \\ \hline 1 & 0 & 1 & 2 & 0 & \\ \end{array}
  3. Il riporto si scarta e così otteniamo il risultato: 120

Esempio

Sommare in BCD i numeri 250 e -370.

  1. Effettuiamo il complemento a 10 di 370:

    \begin{array}{rrrrr} 9 & 9 & 9 & 9 & - \\ & 3 & 7 & 0 & = \\ \hline 9 & 6 & 2 & 9 & + \\ & & & 1 & = \\ \hline 9 & 6 & 3 & 0 \\ \end{array}
  2. Sommiamo 250 con il complemento a 10 di -370:

    \begin{array}{rrrrrr} & 0 & 2 & 5 & 0 & + \\ & 9 & 6 & 3 & 0 & = \\ \hline & 9 & 8 & 8 & 0 & \\ \end{array}
  3. Il risultato non ha riporto ma ha un 9 come cifra più significativa. Quindi si tratta di un numero negativo. Per ottenere il risultato dobbiamo effettuare il complemento a 10 di 9880 e aggiungere il segno meno:

    \begin{array}{rrrrr} 9 & 9 & 9 & 9 & - \\ 9 & 8 & 8 & 0 & = \\ \hline 0 & 1 & 1 & 9 & + \\ & & & 1 & = \\ \hline 0 & 1 & 2 & 0 \\ \end{array}

Quindi il risultato è -120.

La sottrazione di numeri decimali, sia senza segno che nel sistema complemento a 10 con segno, è la stessa del caso binario: si prende il complemento a 10 del sottraendo e si aggiunge al minuendo. Molti computer hanno hardware speciale per eseguire calcoli aritmetici direttamente con numeri decimali in BCD. L'utente del computer può specificare istruzioni programmate per eseguire l'operazione aritmetica con numeri decimali direttamente, senza doverli convertire in binario.

Altri Codici Decimali

I codici binari per le cifre decimali richiedono un minimo di quattro bit per cifra. Molti codici diversi possono essere formulati disponendo quattro bit in 10 combinazioni distinte. BCD e altri tre codici rappresentativi sono mostrati nella tabella seguente:

Cifra Decimale BCD 8421 BCD 2421 Eccesso-3 8, 4, −2, −1
0 0000 0000 0011 0000
1 0001 0001 0100 0111
2 0010 0010 0101 0110
3 0011 0011 0110 0101
4 0100 0100 0111 0100
5 0101 1011 1000 1011
6 0110 1100 1001 1010
7 0111 1101 1010 1001
8 1000 1110 1011 1000
9 1001 1111 1100 1111
Non usato 1010 0101 0000 0001
Non usato 1011 0110 0001 0010
Non usato 1100 0111 0010 0011
Non usato 1101 1000 1101 1100
Non usato 1110 1001 1110 1101
Non usato 1111 1010 1111 1110
Tabella 2: Codici binari per le cifre decimali

Ogni codice usa solo 10 delle possibili 16 combinazioni di bit che possono essere disposte con quattro bit. Le altre sei combinazioni non utilizzate non hanno significato e dovrebbero essere evitate.

Nella seconda colonna è riportato il codice BCD che abbiamo studiato sopra e che spesso è chiamato BCD 8421.

BCD e il codice 2421 sono esempi di codici pesati. In un codice pesato, ogni posizione di bit è assegnata a un fattore di peso in modo tale che ogni cifra possa essere valutata sommando i pesi di tutti gli 1 nella combinazione codificata.

Il codice BCD ha pesi di 8, 4, 2 e 1 da cui deriva il suo nome che corrispondono ai valori delle potenze di due di ogni bit. L'assegnazione di bit 0110, per esempio, è interpretata dai pesi per rappresentare il decimale 6 perché:

8 \cdot 0 + 4 \cdot 1 + 2 \cdot 1 + 1 \cdot 0 = 6

La combinazione di bit 1101, quando pesata dalle rispettive cifre 2421, dà l'equivalente decimale di:

2 \cdot 1 + 4 \cdot 1 + 2 \cdot 0 + 1 \cdot 1 = 7.

Si noti che alcune cifre possono essere codificate in due modi possibili nel codice 2421. Per esempio, il decimale 4 può essere assegnato alla combinazione di bit 0100 o 1010, poiché entrambe le combinazioni si sommano a un peso totale di 4.

I sommatori BCD addizionano i valori BCD direttamente, cifra per cifra, senza convertire i numeri in binario. Tuttavia, è necessario aggiungere 6 al risultato se è maggiore di 9. I sommatori BCD richiedono significativamente più hardware e non hanno un vantaggio di velocità rispetto ai sommatori binari convenzionali rispetto ad anni fa.

Il codice 2421 e il codice eccesso-3 sono esempi di codici auto-complementanti. Tali codici hanno la proprietà che il complemento a 9 di un numero decimale si ottiene direttamente cambiando gli 1 in 0 e gli 0 in 1 (cioè, complementando ogni bit nel pattern). Per esempio, i codici nella tabella di sopra indicano che il decimale 395 è rappresentato nel codice eccesso-3 come 0110 1100 1000. Il suo complemento a 9, 604, è rappresentato come 1001 0011 0111, che si ottiene semplicemente complementando ogni bit del codice per 395 (come con il complemento a 1 dei numeri binari).

Il codice eccesso-3 è stato usato in alcuni computer più vecchi a causa della sua proprietà auto-complementante. L'eccesso-3 è un codice non pesato in cui ogni combinazione codificata si ottiene dal valore binario corrispondente più 3. Si noti che il codice BCD non è auto-complementante.

Il codice 8, 4, -2, -1 è un esempio di assegnazione di pesi sia positivi che negativi a un codice decimale. In questo caso, la combinazione di bit 0110 è interpretata come decimale 2 e viene calcolata da:

8 \cdot 0 + 4 \cdot 1 + (-2) \cdot 1 + (-1) \cdot 0 = 2.