Sistemi di numerazione

CAPITOLO DUE Sistemi di Numerazione

Il capitolo uno ha discusso come i computer memorizzano i numeri usando i transistor, minuscoli dispositivi che agiscono come interruttori con solo due posizioni, acceso o spento. Un singolo transistor, quindi, può memorizzare solo uno di due possibili numeri, uno o zero. Questo non è utile per nulla di più complesso del controllo di una lampadina, quindi per valori più grandi, i transistor sono raggruppati in modo che la loro combinazione di uni e zeri possa essere usata per rappresentare numeri più grandi.

Questo capitolo discute alcuni dei metodi che vengono usati per rappresentare i numeri con gruppi di transistor o bit. Al lettore verranno anche forniti metodi per calcolare i valori minimi e massimi di ciascuna rappresentazione in base al numero di bit nel gruppo.

2.1 Conteggio Binario Senza Segno

La forma più semplice di rappresentazione numerica con bit è il binario senza segno. Quando contiamo in su attraverso gli interi positivi usando il decimale, iniziamo con uno 0 nella posizione delle unità e incrementiamo quel valore finché non raggiungiamo il limite superiore di una singola cifra, cioè 9. A quel punto, abbiamo esaurito i "simboli" che usiamo per contare, e dobbiamo incrementare la cifra successiva, la posizione delle decine. Quindi resettiamo la posizione delle unità a zero e ricominciamo il ciclo.

Figura 2-1 Conteggio in Decimale

Dato che i computer non hanno un numero infinito di transistor, il numero di cifre che possono essere usate per rappresentare un numero è limitato. Questo sarebbe come dire che potremmo usare solo le posizioni delle centinaia, delle decine e delle unità quando contiamo in decimale.

Questo ha due risultati. Primo, limita il numero di valori che possiamo rappresentare. Per il nostro esempio in cui ci è permesso contare solo fino alla posizione delle centinaia in decimale, saremmo limitati all'intervallo di valori da 0 a 999.

Secondo, abbiamo bisogno di un modo per mostrare agli altri che stiamo limitando il numero di cifre. Questo di solito viene fatto aggiungendo zeri iniziali al numero per riempire eventuali posizioni inutilizzate. Per esempio, un decimale 18 verrebbe scritto 018 se fossimo limitati a tre cifre decimali.

Il conteggio con i bit, d'ora in poi indicato come conteggio in binario, è soggetto a questi stessi problemi. L'unica differenza è che il decimale usa dieci simboli (0, 1, 2, 3, 4, 5, 6, 7, 8 e 9) mentre il binario ne usa solo due (0 e 1).

Per cominciare, la Figura 2-2 mostra che quando si conta in binario, esauriamo rapidamente i simboli richiedendo l'aggiunta di un'altra "posizione" dopo solo il secondo incremento.

Figura 2-2 Conteggio in Binario

Se stessimo contando usando quattro bit, la sequenza sarebbe simile a: 0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111, 1000, 1001, 1010, 1011, 1100, 1101, 1110 e 1111. Si noti che, se limitati a quattro bit, raggiungiamo il nostro limite a 1111, che è il quindicesimo valore. Si dovrebbe anche notare che abbiamo finito con 2 x 2 x 2 x 2 = 16 valori diversi. Con due simboli per ogni bit, abbiamo 2n possibili combinazioni di simboli dove n rappresenta il numero di bit.

In decimale, sappiamo cosa rappresenta ogni cifra: unità, decine, centinaia, migliaia, ecc.. Come facciamo a capire cosa rappresentano le diverse cifre in binario? Se torniamo al decimale, vediamo che ogni posizione può contenere una delle dieci cifre. Dopo che la cifra delle unità conta da 0 a 9, dobbiamo incrementare la posizione delle decine. Successivamente, la terza posizione viene incrementata dopo che sono state contate 9 decine e 9 unità, cioè 99 incrementi. Questo la rende la posizione delle centinaia.

In binario, la posizione più a destra è considerata la posizione delle unità proprio come in decimale. La posizione successiva viene incrementata dopo che la posizione delle unità raggiunge 1. Ciò significa che la seconda posizione in binario rappresenta il valore dopo 1, cioè un decimale 2. La terza posizione viene incrementata dopo che c'è un 1 sia nella posizione delle unità che in quella delle due, cioè abbiamo contato fino a un decimale 3. Pertanto, la terza posizione rappresenta un decimale 4. Continuando questo processo ci mostra che ogni posizione in binario rappresenta una successiva potenza di due.

La Figura 2-3 usa 5 bit per contare fino a un decimale 17. Esamina ogni riga in cui è presente un singolo uno nel numero binario. Questo rivela cosa rappresenta quella posizione. Per esempio, un binario 01000 risulta equivalente a un decimale 8. Pertanto, la quarta posizione bit da destra è la posizione degli 8.

Valore decimale   Valore binario     Valore decimale   Valore binario
0                 00000              9                 01001
1                 00001              10                01010
2                 00010              11                01011
3                 00011              12                01100
4                 00100              13                01101
5                 00101              14                01110
6                 00110              15                01111
7                 00111              16                10000
8                 01000              17                10001

Figura 2-3 Equivalenti Binario-Decimale da 0 a 17

Queste informazioni ci aiuteranno a sviluppare un metodo per convertire numeri binari senza segno in decimali e viceversa.

Alcuni di voi potrebbero riconoscerlo come matematica "in base 2". Questo ci fornisce un metodo per indicare quale rappresentazione viene utilizzata quando si scrive un numero su carta. Per esempio, il numero 100 rappresenta un valore decimale o un valore binario? Dato che il binario è in base 2 e il decimale è in base 10, un pedice "2" viene posto alla fine di tutti i numeri binari in questo libro e un pedice "10" viene posto alla fine di tutti i numeri decimali. Ciò significa che un binario 100 dovrebbe essere scritto come 100₂ e un decimale 100 dovrebbe essere scritto come 100₁₀.

2.2 Terminologia Binaria

Quando si scrivono valori in decimale, è comune separare le posizioni dei numeri grandi in gruppi di tre cifre separate da virgole. Per esempio, 345323745₁₀ è tipicamente scritto 345.323.745₁₀ mostrando che ci sono 345 milioni, 323 mila e 745 unità. Questa pratica rende più facile leggere e comprendere la grandezza dei numeri. Anche i numeri binari sono divisi in componenti a seconda della loro applicazione. Ogni raggruppamento binario ha ricevuto un nome.

Per cominciare, una singola posizione in un numero binario è chiamata bit, abbreviazione di cifra binaria. Per esempio, il numero binario 0110₂ è composto da quattro bit. Il bit più a destra, quello che rappresenta la posizione delle unità, è chiamato Bit Meno Significativo o LSB (Least Significant Bit). Il bit più a sinistra, quello che rappresenta la più alta potenza di due per quel numero, è chiamato Bit Più Significativo o MSB (Most Significant Bit). Si noti che l'MSB rappresenta una posizione bit. Non significa che un '1' debba esistere in quella posizione.

I quattro termini successivi descrivono come i bit potrebbero essere raggruppati insieme.

  • Nibble – Un numero binario di quattro bit

  • Byte – Un'unità di memorizzazione per un singolo carattere, tipicamente un numero binario di otto bit (2 nibble) (abbreviazione di termine binario)

  • Word – Tipicamente un numero binario di sedici bit (2 byte)

  • Double Word – Un numero binario di trentadue bit (2 word)

I seguenti sono alcuni esempi di ogni tipo di numero binario.

Bit 1₂

Nibble 1010₂

Byte 10100101₂

Word 1010010111110000₂

Double Word 10100101111100001100111011101101₂

2.3 Conversione da Binario Senza Segno a Decimale

Come mostrato nella sezione 2.1, ogni posizione in un numero binario corrisponde a una specifica potenza di 2 a partire dal bit più a destra che rappresenta 2⁰=1. È attraverso questa organizzazione dei bit che convertiremo i numeri binari nel loro equivalente decimale. La Figura 2-4 mostra le posizioni dei bit e le corrispondenti potenze di due per ogni bit nelle posizioni da 0 a 7.

Figura 2-4 Valori Rappresentati da Ciascuna delle Prime 8 Posizioni Bit

Per iniziare a convertire un numero binario senza segno in decimale, identifica ogni posizione bit che contiene un 1. È importante notare che numeriamo le posizioni bit a partire da 0 che identifica il bit più a destra.

Successivamente, somma le potenze di 2 per ogni posizione contenente un 1. Questa somma è l'equivalente decimale del valore binario. Un esempio di questo processo è mostrato nella Figura 2-5 dove il numero binario 10110100₂ viene convertito nel suo equivalente decimale.

Posizione bit     7    6    5    4    3    2    1    0
Valore binario    1    0    1    1    0    1    0    0

10110100₂ =  2⁷ + 2⁵ + 2⁴ + 2²
         = 128₁₀ + 32₁₀ + 16₁₀ + 4₁₀
         = 180₁₀

Figura 2-5 Esempio di Conversione di 10110100₂ in Decimale

Questo solleva una questione importante quando si rappresentano numeri con un computer. Si noti che quando un computer memorizza un numero, usa un numero limitato di transistor. Se, per esempio, siamo limitati a otto transistor, ciascun transistor che memorizza un singolo bit, allora abbiamo un limite superiore alla dimensione del valore decimale che possiamo memorizzare.

Il più grande numero senza segno di otto bit che possiamo memorizzare ha un 1 in tutte le otto posizioni, cioè 11111111₂. Questo numero non può essere incrementato senza forzare un overflow al bit successivo più alto. Pertanto, il più grande valore decimale che 8 bit possono rappresentare in binario senza segno è la somma di tutte le potenze di due da 0 a 7.

11111111₂ = 2⁷ + 2⁶ + 2⁵ + 2⁴ + 2³ + 2² + 2¹ + 2⁰ = 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255₁₀

Se aggiungi uno a questo valore, il risultato è 256 che è 2⁸, la potenza di due per la successiva posizione bit. Questo ha senso perché se aggiungi 1 a 11111111₂, allora iniziando dalla prima colonna, 1 viene aggiunto a 1 dando un risultato di 0 con un riporto di 1 alla colonna successiva. Questo si propaga all'MSB dove un riporto finale viene passato al nono bit. Il valore finale è quindi 100000000₂ = 256₁₀.

11111111₂ + 1 = 100000000₂ = 256₁₀ = 2⁸

Pertanto, il valore massimo che può essere rappresentato con 8 bit in binario senza segno è 2⁸ – 1 = 255.

Si scopre che lo stesso risultato si trova per qualsiasi numero di bit. Il valore massimo che può essere rappresentato con n bit in binario senza segno è 2ⁿ – 1.

Valore binario senza segno massimo rappresentato con n bit = 2ⁿ – 1 (2.1)

Possiamo guardare questo da un altro punto di vista. Ogni cifra di un numero binario può assumere 2 valori possibili, 0 e 1. Dato che ci sono due valori possibili per la prima cifra, due valori possibili per la seconda cifra, due per la terza, e così via fino a raggiungere l'n-esimo bit, allora possiamo trovare il numero totale di possibili combinazioni di 1 e 0 per n-bit moltiplicando 2 n volte, cioè 2ⁿ.

Come si concilia questo con il nostro limite superiore di 2ⁿ-1? Da dove viene il "-1"? Ricorda che il conteggio usando interi binari senza segno inizia da 0, non da 1. Dare a 0 uno degli schemi di bit toglie uno al valore massimo.

2.4 Conversione da Decimale a Binario Senza Segno

La conversione da decimale a binario senza segno è un po' più complicata, ma non è comunque troppo difficile. Ancora una volta, c'è un processo ben definito.

Per cominciare, è utile ricordare le potenze di 2 che corrispondono a ciascuna posizione bit nel sistema di numerazione binario. Queste sono state presentate nella Figura 2-4 per le potenze di 2⁰ fino a 2⁷.

Quello che dobbiamo fare è separare il valore decimale nelle sue componenti di potenza di 2. Il modo più semplice per iniziare è trovare la più grande potenza di 2 che sia minore o uguale al nostro valore decimale. Per esempio, se stessimo convertendo 75₁₀ in binario, la più grande potenza di 2 minore o uguale a 75₁₀ è 2⁶ = 64.

Il passo successivo è mettere un 1 nella posizione corrispondente a quella potenza di 2 per indicare che questa potenza di 2 è un componente del nostro valore decimale originale.

Successivamente, sottraiamo questa prima potenza di 2 dal valore decimale originale. Nel nostro esempio, ciò ci darebbe 75₁₀ – 64₁₀ = 11₁₀. Se il risultato non è uguale a zero, torniamo al primo passo in cui abbiamo trovato la più grande potenza di 2 minore o uguale al nuovo valore decimale. Nel caso del nostro esempio, cercheremmo la più grande potenza di 2 minore o uguale a 11₁₀ che sarebbe 2³ = 8.

Quando il risultato della sottrazione raggiunge lo zero, e alla fine lo farà, la conversione è completa. Basta mettere degli 0 nelle posizioni bit che non contengono 1. La Figura 2-6 illustra questo processo usando un diagramma di flusso.

Se arrivi fino alla posizione bit zero e hai ancora un risultato diverso da zero, allora una delle due cose è successa. O c'è stato un errore in una delle tue sottrazioni, oppure non hai iniziato con un numero di bit sufficientemente grande. Ricorda che un numero fisso di bit, n, può rappresentare solo un valore intero fino a 2ⁿ – 1. Per esempio, se stai cercando di convertire 312₁₀ in binario senza segno, otto bit non saranno sufficienti perché il valore più alto che otto bit possono rappresentare è 2⁸ – 1 = 255₁₀. Nove bit, tuttavia, funzioneranno perché il suo valore massimo senza segno è 2⁹ – 1 = 511₁₀.

Figura 2-6 Diagramma di Flusso per la Conversione da Decimale a Binario Senza Segno

Esempio Converti il valore decimale 133₁₀ in un numero binario senza segno di 8 bit.

Soluzione Dato che 133₁₀ è minore di 2⁸ – 1 = 255, 8 bit saranno sufficienti per questa conversione. Usando la Figura 2-4, vediamo che la più grande potenza di 2 minore o uguale a 133₁₀ è 2⁷ = 128. Pertanto, mettiamo un 1 nella posizione bit 7 e sottraiamo 128 da 133.

Posizione bit   7  6  5  4  3  2  1  0
                1
133 – 128 = 5

Il nostro nuovo valore decimale è 5. Dato che questo è un valore diverso da zero, il nostro passo successivo è trovare la più grande potenza di 2 minore o uguale a 5. Questa sarebbe 2² = 4. Quindi mettiamo un 1 nella posizione bit 2 e sottraiamo 4 da 5.

Posizione bit   7  6  5  4  3  2  1  0
                1        1
5 – 4 = 1

Il nostro nuovo valore decimale è 1, quindi troviamo la più grande potenza di 2 minore o uguale a 1. Questa sarebbe 2⁰ = 1. Quindi mettiamo un 1 nella posizione bit 0 e sottraiamo 1 da 1.

Posizione bit   7  6  5  4  3  2  1  0
                1        1        1
1 – 1 = 0

Dato che il risultato della nostra ultima sottrazione è 0, la conversione è completa. Metti degli zeri nelle posizioni bit vuote.

Posizione bit   7  6  5  4  3  2  1  0
                1  0  0  0  0  1  0  1

E il risultato è:

133₁₀ = 10000101₂

2.5 Rappresentazione Binaria di Valori Analogici

La conversione di interi (positivi) senza segno in binario è solo uno dei molti modi in cui i computer rappresentano i valori usando bit binari. Questo capitolo ne ha ancora altri due da trattare, e il Capitolo 3 ne tratterà ancora di più.

Questa sezione si concentra sui problemi e sulle soluzioni per cercare di mappare valori del mondo reale come temperatura o peso da un intervallo specificato a un intero binario. Per esempio, un computer che usa 8 bit per rappresentare un intero è in grado di rappresentare 256 valori individuali da 0 a 255. La temperatura, tuttavia, è un valore in virgola mobile con limiti superiori e inferiori non realistici. Possiamo far rappresentare a un computer una temperatura usando otto bit? La risposta è sì, ma ci costerà in termini di risoluzione e intervallo.

Un altro esempio di valori analogici è il modello delle onde sonore come quelle della musica. La Figura 2-7 rappresenta un tale segnale.

Figura 2-7 Esempio di Segnale Analogico Sonoro

Ricorda che un singolo bit binario può essere impostato solo su uno dei due valori: logico 1 o logico 0. La combinazione di molti bit insieme consente una gamma di interi, ma questi sono ancora valori discreti. Il mondo reale è analogico, con valori rappresentati da misurazioni in virgola mobile capaci di risoluzione infinita. Per usare un numero binario di n bit per rappresentare l'analogico, dobbiamo porre alcune restrizioni su ciò che viene misurato.

Primo, un numero binario di n bit ha un intervallo limitato. Lo abbiamo visto convertendo interi positivi senza segno in binario. In questo caso, il limite inferiore era 0 e il limite superiore era 2ⁿ-1. Per usare n-bit per rappresentare un valore analogico, dobbiamo limitare l'intervallo ammissibile di misurazioni analogiche. Questo non deve essere un problema.

Per esempio, una tipica bilancia da bagno ha bisogno di misurare valori superiori a 400 libbre? In caso contrario, un sistema digitale potrebbe usare un numero binario di 10 bit mappato su un intervallo da zero a 400 libbre. Un binario 0000000000₂ potrebbe rappresentare zero libbre mentre 1111111111₂ potrebbe rappresentare 400 libbre.

Quello che serve dopo è un metodo per mappare i valori all'interno dell'intervallo da zero a 400 libbre agli interi binari nell'intervallo da 0000000000₂ a 1111111111₂. Per fare questo, abbiamo bisogno di una funzione lineare che definisca una mappatura uno-a-uno tra ogni intero binario e il valore analogico che rappresenta. Per fare questo, ci rivolgiamo all'espressione matematica di base per una funzione lineare.

y=mx+by = m * x + b

Questa funzione definisce m come la velocità di variazione di y rispetto alle variazioni di x e b come il valore a cui y è impostato quando x è uguale a 0. Possiamo usare questa espressione per mappare un intero binario x a un valore analogico y.

La pendenza di questa funzione, m, può essere calcolata dividendo l'intervallo dei valori analogici per il numero di intervalli definiti dall'intero binario di n bit. Il numero di intervalli definiti dall'intero binario di n bit è uguale al limite superiore di quel numero binario se venisse usato come intero senza segno, cioè 2ⁿ-1.

     Intervallo di valori analogici
m = ---------------------------------
    Numero di intervalli dell'intero binario

     Valore analogico massimo - Valore analogico minimo
m = -----------------------------------------------------      (2.2)
                      2ⁿ – 1

Torniamo al nostro esempio della bilancia da cucina dove il valore analogico massimo è 400 libbre mentre il minimo è zero libbre. Se un valore binario di 10 bit viene usato per rappresentare questo valore analogico, allora il numero di intervalli dell'intero binario è 2¹⁰ – 1 = 1023. Questo ci dà una pendenza di:

      400 libbre – 0 libbre
m = ---------------------------- = 0.391 libbre/incremento binario
      1023 incrementi binari

Ciò significa che ogni volta che il numero binario incrementa, ad esempio, da 0110110010₂ a 0110110011₂, rappresenta un incremento nel valore analogico di 0.391 libbre. Dato che un valore binario di 0000000000₂ rappresenta un valore analogico di 0 libbre, allora 0000000001₂ rappresenta 0.391 libbre, 0000000010₂ rappresenta 2 × 0.391 = 0.782 libbre, 0000000011₂ rappresenta 3 × 0.391 = 1.173 libbre e così via.

In alcuni casi, il limite inferiore potrebbe essere qualcosa di diverso da 0. Questo è importante soprattutto se è richiesta una migliore precisione. Per esempio, un forno da cucina può avere un limite superiore di 600°F. Se lo zero venisse usato come limite inferiore, allora l'intervallo di temperatura 600°F – 0°F = 600°F dovrebbe essere mappato ai 2ⁿ possibili valori binari di un numero binario di n bit. Per un numero binario di 9 bit, questo risulterebbe in un m di:

    600°F – 0°F
m = ------------ = 1.1742 gradi/incremento binario
      2⁹ – 1

Un forno ha davvero bisogno di misurare valori inferiori a 100°F? In caso contrario, si potrebbe usare un limite inferiore di 100°F riducendo la dimensione dell'intervallo analogico a 500°F. Questo intervallo più piccolo migliorerebbe la precisione del sistema perché ogni cambiamento nel valore binario risulterebbe in un incremento più piccolo nel valore analogico.

     600°F – 100°F
m = ---------------- = 0.9785 gradi/incremento binario
        2⁹ – 1

L'incremento più piccolo significa che ogni valore binario sarà una rappresentazione più accurata del valore analogico. Questo limite inferiore diverso da zero si realizza come un valore diverso da zero per b nell'espressione lineare y=mx + b. Dato che y è uguale a b quando x è uguale a zero, allora b deve essere uguale al limite inferiore dell'intervallo.

b = Valore analogico minimo (2.3)

L'espressione finale che rappresenta la conversione tra un valore analogico e la sua rappresentazione binaria è mostrata nell'Equazione 2.4.

           Amax - Amin
Acalc = ( ------------- * X ) + Amin   (2.4)
             2ⁿ - 1

dove: Acalc = valore analogico rappresentato dal valore binario, Amax = valore analogico massimo, Amin = valore analogico minimo, X = valore binario che rappresenta il valore analogico, n = numero di bit nel valore binario

Esempio

Supponiamo che il processore che monitora la temperatura di un forno con un intervallo di temperatura da 100°F a 600°F misuri un valore binario di 9 bit di 011001010₂. Quale temperatura rappresenta?

Soluzione

Precedentemente, abbiamo calcolato la velocità di variazione, m, per un forno con un intervallo di temperatura da 100°F a 600°F come 500°F ÷ 511 incrementi binari. Sostituendo questo insieme al nostro valore analogico minimo di 100°F nell'Equazione 2.4 otteniamo:

temperatura = (( 500°F / 511 incrementi binari ) * valore binario ) + 100°F

Se il processore che monitora la temperatura di questo forno legge un valore binario di 011001010₂, la temperatura approssimativa può essere determinata convertendo 011001010₂ in decimale e inserendolo nell'equazione sopra.

011001010₂ = 2⁷ + 2⁶ + 2³ + 2¹ = 128 + 64 + 8 + 2 = 202₁₀

temperatura = (( 500°F / 511 ) * 202 ) + 100°F
temperatura = 297.65°F

Il valore dell'esempio precedente è leggermente impreciso. Il valore binario 011001010₂ rappresenta in realtà un intervallo di valori ampio 0.9785°F centrato o con un limite inferiore di 297.65°F. Solo un valore binario con un numero infinito di bit sarebbe completamente accurato. Dato che ciò non è possibile, ci sarà sempre un intervallo o una risoluzione associata a un sistema digitale a causa della natura quantizzata dei valori interi binari. Questo intervallo è equivalente all'incremento o alla velocità di variazione dell'espressione lineare.

               Intervallo analogico
Risoluzione = ------------------------   (2.5)
                    2ⁿ – 1

Esempio

Supponiamo che l'intervallo analogico di un sistema che utilizza un convertitore analogico-digitale a 10 bit vada da un limite inferiore di 5 once a un limite superiore di 11 once. Qual è la risoluzione di questo sistema?

Soluzione

Per determinare la risoluzione, iniziamo con l'intervallo analogico.

Intervallo analogico = Valore analogico massimo - Valore analogico minimo
                   = 11 once – 5 once
                   = 6 once

Sostituendo questo intervallo nell'equazione 2.5 e usando n=10 per rappresentare il numero di bit, otteniamo:

               6 once
Risoluzione = ------------ =
               2¹⁰ - 1

               6 once
             ------------------- = 0.005865 once/incremento
             1023 incrementi

Se esaminiamo i risultati dell'esempio precedente, vediamo che il nostro sistema può misurare 0 once, 0.005865 once, 0.011730 once (2 * 0.005865 once), 0.017595 once (3 * 0.005865 once), e così via, ma non potrà mai rappresentare la misurazione di 0.015 once. La sua risoluzione non è così buona. Per ottenere quella risoluzione, sarebbe necessario aumentare il numero di bit nell'intero binario o ridurre l'intervallo analogico.

Esempio

Quanti bit sarebbero necessari per l'esempio precedente per migliorare la risoluzione a meglio di 0.001 once per incremento?

Soluzione

Ogni volta che aumentiamo di uno il numero di bit nel nostro intero binario, il numero di incrementi nell'intervallo viene approssimativamente raddoppiato. Per esempio, passando da 10 bit a 11 bit il numero di incrementi nell'intervallo aumenta da 2¹⁰ – 1 = 1023 a 2¹¹ – 1 = 2047. La domanda è quanto in alto dobbiamo andare per ottenere una risoluzione specificata? Per rispondere a ciò, iniziamo impostando l'Equazione 2.5 in modo da rappresentare il fatto che vogliamo una risoluzione migliore di 0.001 once/incremento.

  6 once
----------- > 0.001 once/incremento
  2ⁿ – 1

Risolvendo per 2ⁿ – 1 otteniamo:

           6 once
2ⁿ – 1 > ---------------------------
          0.001 once/incremento

2ⁿ – 1 > 6,000 incrementi

Sostituendo diversi interi per n nell'equazione sopra, troviamo che n=13 è il valore più basso di n per il quale si raggiunge una risoluzione migliore di 0.001 once/incremento. n=13 si traduce in una risoluzione di 6 ÷ 8191 = 0.0007325 once/incremento.

2.6 Teoria del Campionamento

La precedente discussione sulla rappresentazione intera di valori analogici mostra come il numero di bit possa influenzare l'errore di arrotondamento della rappresentazione. In generale, un convertitore analogico-digitale a n bit divide l'intervallo analogico in 2ⁿ – 1 incrementi. La Figura 2-8 presenta quattro grafici, ciascuno con un diverso numero di bit che fornisce diversi livelli di risoluzione. La figura mostra come l'aggiunta di un bit possa migliorare la risoluzione dei valori rappresentati dagli interi binari.

Figura 2-8 Effetti del Numero di Bit sull'Errore di Arrotondamento

In precedenza, è stato menzionato come un computer possa catturare solo un "istantanea" o un campione di una tensione analogica. Questo è sufficiente per valori analogici a variazione lenta, ma se un segnale varia rapidamente, alcuni dettagli potrebbero essere persi. Per migliorare la rappresentazione digitale del segnale, è necessario aumentare la velocità con cui vengono prelevati i campioni, la velocità di campionamento.

Esiste anche la possibilità di perdere una frequenza più alta perché la velocità di campionamento è troppo bassa. Questo è chiamato aliasing, e ci sono esempi nella vita di tutti i giorni.

Quando guidi un'auto di notte, potresti aver notato che a volte le ruote di un'auto adiacente sembrano girare a una velocità diversa da quella reale o addirittura sembrano girare all'indietro. (Se non hai idea di cosa sto parlando, guarda le ruote dell'auto accanto a te la prossima volta che sei un passeggero che viaggia di notte sotto le luci stradali).

L'effetto è causato dal fatto che la luce dei lampioni in realtà pulsa, un fatto che di solito non è rilevabile dall'occhio umano. Questa pulsazione fornisce una velocità di campionamento, e se la velocità di campionamento non è abbastanza veloce per la ruota che gira, la ruota sembra girare a una velocità diversa da quella reale. Le luci stradali non sono necessarie per vedere questo effetto. Il tuo occhio ha una sua velocità di campionamento, il che significa che potresti sperimentare questo fenomeno durante il giorno.

L'aliasing è anche il motivo per cui le luci fluorescenti non vengono mai usate nelle segherie. Le luci fluorescenti lampeggiano come una luce stroboscopica molto veloce e possono far sembrare gli oggetti come se non si stessero muovendo. Se la frequenza delle luci fluorescenti e la velocità di una lama di sega in movimento sono multipli l'una dell'altra, può sembrare che la lama che gira non si stia muovendo affatto.

Entrambi questi esempi sono situazioni in cui si è verificato aliasing. Se la frequenza di un segnale è più veloce della velocità di campionamento, allora le informazioni andranno perse e i dati raccolti non saranno mai in grado di duplicare l'originale.

I grafici nella Figura 2-9 mostrano come diverse velocità di campionamento possano comportare diverse interpretazioni dei dati raccolti, con i punti scuri che rappresentano i campioni. Si noti che il grafico in basso a destra rappresenta una buona velocità di campionamento. Quando il computer riproduce il segnale, la discontinuità della riproduzione verrà rimossa a causa degli effetti di filtraggio naturali dei circuiti analogici.

Figura 2-9 Effetti di Aliasing Dovuti a una Lenta Velocità di Campionamento

Per evitare l'aliasing, la velocità con cui vengono prelevati i campioni deve essere più del doppio della frequenza più alta che si desidera catturare. Questo è chiamato Teorema di Nyquist. Per esempio, la velocità di campionamento per i CD audio è di 44.100 campioni/secondo. Dividendo questo numero per due otteniamo la frequenza più alta che un CD audio può riprodurre, cioè 22.050 Hz.

Per un segnale telefonico analogico, un singolo campione viene convertito in un intero a 8 bit. Se questi campioni vengono trasmessi attraverso un singolo canale di una linea T1 che ha una velocità di dati di 56 Kbps (kilobit al secondo), possiamo determinare la velocità di campionamento.

                                  56.000 bit/secondo
Velocità di campionamento T1 = ------------------------
                                    8 bit/campione

Velocità di campionamento T1 = 7.000 campioni/secondo

Ciò significa che la frequenza analogica più alta che può essere trasmessa attraverso una linea telefonica usando un singolo canale di un collegamento T1 è 7.000 ÷ 2 = 3.500 Hz. Ecco perché la qualità delle voci inviate per telefono è scarsa rispetto alla qualità CD. Sebbene gli utenti telefonici possano ancora riconoscere la voce del chiamante all'altro capo della linea quando le frequenze più alte vengono eliminate, il loro discorso spesso suona ovattato.

2.7 Rappresentazione Esadecimale

Di solito è difficile per una persona guardare un numero binario e riconoscerne istantaneamente la grandezza. A meno che tu non sia molto esperto nell'uso dei numeri binari, riconoscere le grandezze relative di 10101101₂ e 10100101₂ non è immediato (173₁₀ è maggiore di 165₁₀). Né ci è immediatamente evidente che 1001101101₂ sia uguale a 621₁₀ senza passare attraverso il processo di calcolo di 512 + 64 + 32 + 8 + 4 + 1.

C'è un altro problema: siamo inclini a commettere errori quando scriviamo o digitiamo numeri binari. Come rapido esercizio, scrivi il numero binario 1001011111101101001000111₂ su un foglio di carta. Hai commesso un errore? La maggior parte delle persone avrebbe commesso almeno un errore.

Per rendere la rappresentazione binaria dei numeri più facile per noi umani, esiste una rappresentazione stenografica per i valori binari. Inizia partizionando un numero binario nei suoi nibble a partire dal bit meno significativo (LSB). Un esempio è mostrato di seguito:

Il numero: 1001011110110100100111 ...può essere diviso in: 10 0101 1110 1101 0010 0111 Successivamente, viene usato un simbolo per rappresentare ciascuna delle possibili combinazioni di bit in un nibble. Iniziamo numerandoli con i valori decimali equivalenti al loro valore binario, cioè:

0000₂ = 0₁₀    0001₂ = 1₁₀    0010₂ = 2₁₀
:          :          :
1000₂ = 8₁₀    1001₂ = 9₁₀

A 9, tuttavia, esauriamo i caratteri decimali. Ci sono altri sei nibble da etichettare, quindi iniziamo a usare le lettere: A, B, C, D, E e F. Queste rappresentano rispettivamente i valori decimali 10₁₀, 11₁₀, 12₁₀, 13₁₀, 14₁₀ e 15₁₀.

1010₂ = A    1011₂ = B
:          :          :
1111₂ = F

La Tabella 2-1 presenta la mappatura tra i sedici schemi di 1 e 0 in un nibble binario e i loro corrispondenti valori decimali ed esadecimali (hex).

Tabella 2-1   Conversione da Binario a Decimale ed Esadecimale
Binario   Decimale   Esadecimale    Binario   Decimale   Esadecimale
0000      0          0              1000      8          8
0001      1          1              1001      9          9
0010      2          2              1010      10         A
0011      3          3              1011      11         B
0100      4          4              1100      12         C
0101      5          5              1101      13         D
0110      6          6              1110      14         E
0111      7          7              1111      15         F

Un altro modo di vederla è che il conteggio esadecimale è simile al decimale tranne che invece di avere 10 numerali, ne ha sedici. Questo è anche indicato come un sistema di numerazione in base 16.

Come convertiamo da binario a esadecimale? Inizia dividendo il numero binario nei suoi nibble (se il numero di bit non è divisibile per 4, aggiungi zeri iniziali), quindi nibble per nibble usa la tabella sopra per trovare l'equivalente esadecimale di ogni schema di 4 bit. Per esempio:

Il numero: 1001011110110100100111 ...è diviso in: 0010 0101 1110 1101 0010 0111 ...che si traduce in: 2 5 E D 2 7

Pertanto, 1001011110110100100111₂ = 25ED27₁₆. Si noti l'uso del pedice "16" per denotare la rappresentazione esadecimale. Andare dall'altra parte è altrettanto facile. Tradurre 5D3F21₁₆ in binario è qualcosa del genere:

Il valore esadecimale: 5 D 3 F 2 1 ...si traduce in: 0101 1101 0011 1111 0010 0001

Pertanto, 5D3F21₁₆ = 010111010011111100100001₂. È fondamentale notare che i computer non usano l'esadecimale, lo fanno gli umani.

L'esadecimale fornisce agli umani un metodo affidabile e abbreviato per scrivere grandi numeri binari.

2.8 Binario Codificato Decimale

Quand'è stata l'ultima volta che hai moltiplicato il tuo numero civico per 5? O hai mai aggiunto 215 al tuo codice fiscale? Queste domande sembrano sciocche, ma rivelano un fatto importante sui numeri. Alcuni numeri non hanno bisogno di operazioni matematiche eseguite su di essi, e quindi, non hanno bisogno di una rappresentazione matematicamente corretta in binario.

Nel tentativo di offrire alla notazione decimale la stessa comodità di conversione in binario che ha l'esadecimale, è stato sviluppato il Binario Codificato Decimale (BCD). Permette una rapida conversione in binario di interi che non richiedono operazioni matematiche.

Come in esadecimale, ogni cifra decimale rappresenta un nibble dell'equivalente binario. La Tabella 2-2 mostra la conversione tra ogni cifra decimale e l'equivalente binario.

Tabella 2-2   Conversione da BCD a Decimale
Nibble BCD   Cifra Decimale    Nibble BCD   Cifra Decimale
0000         0                 1000         8
0001         1                 1001         9
0010         2                 1010         Non valido
0011         3                 1011         Non valido
0100         4                 1100         Non valido
0101         5                 1101         Non valido
0110         6                 1110         Non valido
0111         7                 1111         Non valido

Per esempio, il valore BCD 0001 0110 1001 0010 è uguale a 1692₁₀.

È importante notare che non esiste una conversione algoritmica tra BCD e decimale. Il BCD è solo un metodo per rappresentare numeri decimali in binario.

Un altro elemento da notare è che non tutti i numeri binari si convertono da BCD a decimale. 0101 1011 0101 per esempio è un valore BCD illegale perché il secondo nibble, 1011, non ha un valore decimale corrispondente.

Ci sono due vantaggi principali del BCD rispetto al binario. Primo, qualsiasi operazione matematica basata su un fattore di dieci è più semplice in BCD. La moltiplicazione per dieci, per esempio, aggiunge un nibble di zeri al lato destro del numero. Tutto ciò che serve per troncare o arrotondare un valore in base 10 in BCD è azzerare i nibble appropriati. A causa di questo vantaggio, il BCD viene usato frequentemente nelle applicazioni finanziarie a causa dei requisiti legali che i valori decimali siano rappresentati esattamente. Il binario non può farlo per le frazioni come vedremo nel Capitolo 3.

Il secondo vantaggio è che la conversione tra caratteri numerici inseriti o visualizzati e il valore binario memorizzato è veloce e non richiede molto codice.

Lo svantaggio principale è che a meno che l'operazione non sia basata su una potenza di dieci, le operazioni matematiche sono più complesse e richiedono più hardware. Inoltre, il BCD non è compatto come il binario senza segno e potrebbe richiedere più memoria per l'archiviazione.

Il BCD può essere usato anche per rappresentare valori con segno, sebbene ci siano molte implementazioni. Diversi produttori di processori usano metodi diversi rendendo difficile selezionare uno standard. Uno dei modi più semplici per rappresentare i numeri negativi in BCD è aggiungere un nibble all'inizio del numero che funge da segno più/meno. Usando uno dei valori BCD illegali per rappresentare un segno negativo e un altro per rappresentare un segno positivo, i valori BCD possono essere resi negativi o positivi. I valori binari 1010, 1100 o 1110 in genere significano che il numero è positivo mentre i valori binari 1011 o 1101 significano che il numero è negativo. Per esempio, –1234 in BCD con segno sarebbe 1101 0001 0010 0011 0100 mentre +1234 sarebbe 1100 0001 0010 0011 0100. I valori BCD preceduti da 1111 in genere indicano valori senza segno.

2.9 Codici Gray

L'uso di sequenze di conteggio binarie è comune nelle applicazioni digitali. Per esempio, un valore binario di n bit può essere usato per identificare la posizione di un albero rotante come compresa in uno dei 2ⁿ archi diversi.

[Disegno stilizzato di un albero rotante con un disco fissato ad esso. Sul disco sono presenti diverse tracce concentriche con fessure. Su un lato del disco sono posizionate delle sorgenti luminose e sull'altro lato dei sensori per rilevare il passaggio della luce attraverso le fessure.]

Figura 2-10 mostra come la posizione di un albero potrebbe essere divisa in otto archi usando tre bit. Ciò consentirebbe a un processore di determinare la posizione dell'albero con una precisione di 360°/8 = 45°.

[Disegno che mostra un disco diviso in otto sezioni. Ogni sezione è etichettata con un codice binario a tre bit da 000 a 111.]

Figura 2-10 Otto Valori Binari che Identificano la Posizione di un Albero Rotante

Un tipo di sensore di posizione dell'albero usa un disco montato sull'albero con delle fessure tagliate nel disco a diversi raggi che rappresentano diversi bit. Sorgenti luminose sono poste su un lato del disco mentre sensori sull'altro lato del disco rilevano quando è presente un foro, cioè quando il sensore riceve luce. La Figura 2-11 presenta un disco che potrebbe essere usato per identificare le posizioni dell'albero dell'esempio della Figura 2-10.

Sorgenti luminose         Sensore
     O  O  O             |
      \ | /              |
       \|/               |
   _______               |
  |       |               |
  | Disco |---------------
  |_______|
     /|\
    / | \
   /  |  \
  O   O   O
000
001
110
101
010
011
100
111

Figura 2-11 Esempio di Encoder di Posizione

Nella sua posizione attuale nella figura, le fessure nel disco sono allineate tra il secondo e il terzo sensore di luce, ma non il primo. Ciò significa che il sensore leggerà un valore di 110 che indica che l'albero è in posizione numero 110₂ = 6.

Esiste un potenziale problema con questo metodo di codifica. È possibile leggere il sensore nell'istante in cui più di una fessura si sta aprendo o chiudendo tra la sua sorgente luminosa e il sensore. Quando ciò accade, alcuni dei cambiamenti di bit potrebbero essere rilevati mentre altri no. Se ciò accade, potrebbe verificarsi una misurazione errata.

Per esempio, se l'albero mostrato sopra ruota in senso orario verso la posizione 101₂ = 5, ma nell'istante in cui il sensore viene letto, viene rilevato solo il primo cambiamento di bit, allora il valore letto sarà 111₂ = 7 indicando una rotazione in senso antiorario.

Per risolvere questo problema, vengono usate sequenze di conteggio alternative denominate codice Gray. Queste sequenze hanno solo un cambiamento di bit tra i valori. Per esempio, i valori assegnati agli archi dell'albero sopra potrebbero seguire la sequenza 000, 001, 011, 010, 110, 111, 101, 100. Questa sequenza non è numericamente corretta, ma quando l'albero ruota, solo un bit cambierà quando l'albero passa da una posizione alla successiva.

Esiste un algoritmo per convertire un valore binario senza segno di n bit nel suo corrispondente codice Gray di n bit. Inizia aggiungendo uno 0 all'estremità più significativa del valore binario senza segno. Dovrebbero ora esserci n confini tra gli n+1 bit. Per ogni confine, scrivi uno 0 se i bit adiacenti sono uguali e un 1 se i bit adiacenti sono diversi. Il valore risultante è il corrispondente valore del codice Gray di n bit. La Figura 2-12 presenta un esempio di conversione del valore a 6 bit 100011₂ in codice Gray.

1 0 0 0 1 1   Aggiungi zero al lato più a sinistra del valore da convertire
0 1 0 0 0 1 1

1 1 0 0 1 0   I bit adiacenti che sono diversi generano un 1.
              I bit adiacenti che sono uguali generano uno 0.

Figura 2-12 Conversione da Binario Senza Segno a Codice Gray

Usando questo metodo, è possibile determinare il codice Gray per qualsiasi valore binario. La Tabella 2-3 presenta la sequenza completa del codice Gray per quattro bit. I bit ombreggiati nella terza colonna sono bit diversi dal bit immediatamente alla loro sinistra. Questi sono i bit che diventeranno uno nella sequenza del codice Gray mentre i bit non ombreggiati sono quelli che saranno zero. Si noti che cambia esattamente un bit nel codice Gray da una riga alla successiva e dall'ultima riga alla prima.

Tabella 2-3   Derivazione del Codice Gray a Quattro Bit
Decimale   Binario   Binario con zero iniziale   Codice Gray
0          0000      00000                     0000
1          0001      00001                     0001
2          0010      00010                     0011
3          0011      00011                     0010
4          0100      00100                     0110
5          0101      00101                     0111
6          0110      00110                     0101
7          0111      00111                     0100
8          1000      01000                     1100
9          1001      01001                     1101
10         1010      01010                     1111
11         1011      01011                     1110
12         1100      01100                     1010
13         1101      01101                     1011
14         1110      01110                     1001
15         1111      01111                     1000

2.10 Cosa C'è Dopo?

In questo capitolo, abbiamo trattato i diversi metodi di rappresentazione dei valori, in particolare degli interi positivi, usando circuiti digitali. Oltre al conteggio degli interi, sono state esaminate le questioni relative alla conversione di valori analogici o del "mondo reale" in digitali insieme ad alcuni dei problemi riscontrati durante il campionamento. Infine, sono stati presentati due metodi di rappresentazione binaria: esadecimale e BCD.

Il Capitolo 3 esamina le esigenze speciali relative alla rappresentazione digitale di addizione, sottrazione e valori in virgola mobile. Introduce anche il funzionamento del processore nella gestione di alcune funzioni aritmetiche.

Problemi

  1. Qual è il numero minimo di bit necessari per rappresentare 768₁₀ usando la rappresentazione binaria senza segno?

  2. Qual è il più grande intero possibile che può essere rappresentato con un numero binario senza segno di 6 bit?

  3. Converti ciascuno dei seguenti valori in decimale: a) 10011101₂ b) 10101₂ c) 111001101₂ d) 01101001₂

  4. Converti ciascuno dei seguenti valori in un valore binario senza segno di 8 bit: a) 35₁₀ b) 100₁₀ c) 222₁₀ d) 145₁₀

  5. Se un numero binario di 8 bit viene usato per rappresentare un valore analogico nell'intervallo da 0₁₀ a 100₁₀, cosa rappresenta il valore binario 01100100₂?

  6. Se un numero binario di 8 bit viene usato per rappresentare un valore analogico nell'intervallo da 32 a 212, qual è l'accuratezza del sistema? In altre parole, se il numero binario viene incrementato di uno, quanta variazione rappresenta nel valore analogico?

  7. Supponiamo che un sistema di conversione da digitale ad analogico usi un intero a 10 bit per rappresentare una temperatura analogica in un intervallo da -25°F a 125°F. Se la temperatura effettiva letta fosse di 65.325°F, quale sarebbe il valore più vicino possibile che il sistema potrebbe rappresentare?

  8. Qual è la velocità di campionamento minima necessaria per catturare con successo frequenze fino a 155 KHz in un segnale analogico?

  9. Converti i seguenti numeri in esadecimale: a) 1010111100101100011₂ b) 10010101001001101001₂ c) 01101101001010011001₂ d) 10101100100010₂

  10. Converti ciascuno dei seguenti valori esadecimali in binario: a) ABCD₁₆ b) 1DEF₁₆ c) 8645₁₆ d) 925A₁₆

  11. Vero o Falso: Una lista di numeri da sommare sarebbe un buon candidato per la conversione usando BCD.

  12. Determina quali dei seguenti schemi binari rappresentano numeri BCD validi (con o senza segno). Converti quelli validi in decimale: a) 1010111100101100011 b) 10010101001001101001 c) 01101101001010011001 d) 11000110010000010000 e) 1101100101110010 f) 111100010010010101101000 g) 10101100100010

  13. Converti il numero decimale 96404₁₀ in BCD.

  14. Crea la sequenza del codice Gray a 5 bit.

Riferimenti

  • Computer Organization and Design Fundamentals by David Tarnoff, Chapter 1 -- Digital Signals and Systems

  • Computer Organization and Design Fundamentals by David Tarnoff, Chapter 2 -- Numbering Systems

Last updated