Esercitazione Fondamenti di Informatica B Corso di Laurea in Ingegneria Meccanica 1° Esercitazione: 5 ottobre 2005 Codifica Binaria dell’informazione1 Rappresentazione binaria alfabeto (insieme dei simboli utilizzabili) costituito da cifre 0 e 1 informazione codificata da una sequenza di cifre binarie (bit) Quante sono le informazioni distinte rappresentabili? disponibili N cifre binarie ⇒ 2N configurazioni diverse ⇒ rappresentare al più 2N informazioni distinte ⇒ per rappresentare M informazioni distinte necessarie N = ⎡log M⎤ cifre binarie 2 Codifica dell’informazione codifica = regola per mettere in corrispondenza VALORI DEL DATO DA CODIFICARE ⇔ STRINGHE DI BIT Corrispondenza arbitraria (è una convenzione) ma dev’essere nota e rispettata da chi genera e da chi utilizza le informazioni ⇒ definiti degli standard Arbitrarietà utile per ottenere proprietà particolari dipendenti dall’uso che verrà fatto delle informazioni codificate 1 Versione ridotta e modificata del materiale su codifica dell’informazione del prof. Angelo Morzenti. -1- Classi (tipi) di informazioni da rappresentare 1. Valori numerici Caratteristiche: • rappresentare adeguatamente insiemi della matematica (naturali, interi, razionali, reali) • precisamente, rappresentati dei sottoinsiemi di tali insiemi della matematica • permettere realizzazione circuitale delle operazioni algebriche 2. Informazioni enumerative (es: caratteri) Caratteristiche: • numerabili • non numeriche • ordine di enumerazione significativo: può denotare proprietà delle informazioni e consentire particolari operazioni -2- Rappresentazione di valori numerici consideriamo seguenti classi di valori numerici: • Numeri naturali • Numeri interi (relativi) • Numeri reali Rappresentazione di numeri naturali: codifica pesata (binario naturale) La codifica si basa sulla notazione posizionale o «pesata» che adottiamo usualmente per i numeri codificati in decimale. Terminologia: Base: Valori delle cifre: B (B=2, B=10, B=3, B=16) 0 .. B-1 Notazione posizionale: Bk (2k, 10k) Nella notazione posizionale, in qualunque base, il valore numerico rappresentato da una cifra dipende dal valore della cifra dalla posizione della cifra nel numero Esempio in base 10 P10= 12110 = 1⋅102+2⋅101+1⋅100 Data una base B e un numero di cifre disponibili N ⇒ i numeri naturali (interi ≥ 0) rappresentabili sono 0≤ P ≤ BN-1 -3- Codifica pesata dei numeri naturali in base 2 P2= bN-1 2N-1+ bN-2 2N-2+......+ b2 22+ b1 21+ b0 20 bit più significativo: bN-1 bit meno significativo: b0 Ad esempio: numero di bit disponibili N=3 i valori numerici rappresentabili sono 0≤ P ≤ 23-1 cioè 0≤ P ≤ 7 decimale binario valore 0 000 0 ⋅22+0 ⋅21+0 ⋅20 1 001 0 ⋅22+0 ⋅21+1 ⋅20 2 010 0 ⋅22+1 ⋅21+0 ⋅20 3 011 0 ⋅22+1 ⋅21+1 ⋅20 4 100 1 ⋅22+0 ⋅21+0 ⋅20 5 101 1 ⋅22+0 ⋅21+1 ⋅20 6 110 1 ⋅22+1 ⋅21+0 ⋅20 7 111 1 ⋅22+1 ⋅21+1 ⋅20 -4- Codifica pesata dei numeri naturali in base 2: Esempio numero di bit disponibili N=5 ⇒ i valori numerici P rappresentabili sono 0≤ P ≤ 25-1 cioè 0≤ P ≤ 31 decimale binario 0 00000 valore 0⋅ 24+0⋅ 23+0⋅ 22+0⋅ 21+0⋅ 20 1 00001 0⋅ 24+0⋅ 23+0⋅ 22+0⋅ 21+1⋅ 20 2 00010 0⋅ 24+0⋅ 23+0⋅ 22+1⋅ 21+0⋅ 20 ..... ...... 7 00111 0⋅ 24+0⋅ 23+1⋅ 22+1⋅ 21+1⋅ 20 8 01000 0⋅ 24+1⋅ 23+0⋅ 22+0⋅ 21+0⋅ 20 ..... ...... 15 01111 0⋅ 24+1⋅ 23+1⋅ 22+1⋅ 21+1⋅ 20 16 10000 1⋅ 24+0⋅ 23+0⋅ 22+0⋅ 21+0⋅ 20 ..... ...... 30 11110 1⋅ 24+1⋅ 23+1⋅ 22+1⋅ 21+0⋅ 20 31 11111 1⋅ 24+1⋅ 23+1⋅ 22+1⋅ 21+1⋅ 20 gli zeri davanti «non contano» ma ci devono essere. N=6 N=7 N=8 N=10 N=16 N=32 ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ 0 - 63 0 - 127 0 - 255 0 - 1023 (≅ 1 K = 1.000) 0 - 26⋅210 = 0 - 65535 ≅ 0 - 64.000 (64 K) 0 - 22⋅210 ⋅210 ⋅210 ≅ 0 - 4.000.000.000 (4 G) -5- Rappresentazione dei numeri interi (relativi) Codifica in complemento a 2 Date N cifre binarie, sono disponibili 2N configurazioni distinte: di queste 2N-1 vengono utilizzate per rappresentare valori ≥ 0 2N-1 vengono utilizzate per rappresentare valori < 0 con N bit rappresentati tutti i valori P, con -2N-1 ≤ P ≤ 2N-1 - 1 esempio, N = 4 ⇒ 16 configurazioni distinte, valori ≥ 0: da 0 a 2N-1-1 valori < 0: da -1 a - 2N-1 cioè da 0 a 7 cioè da -1 a -8 N=6 ⇒ da -32 a +31 N=7 ⇒ da -64 a +63 N=8 ⇒ da -128 a +127 N=10 ⇒ da -512 a + 511 N=16 ⇒ da -32.768 a +32.767 N=32 ⇒ da ≅ - 2.000.000.000 a ≅ + 2.000.000.000 La rappresentazione in cpl 2 su N bit si ottiene: P≥0 ⇒ P P <0 ⇒ P in cpl2 = (2N − |P| )2 su N bit ⇒ primo bit = 0 in cpl2 = P2 su N bit ⇒ primo bit = 1 proprietà vantaggiose: - un solo valore per lo 0, nessuna configurazione “sprecata” dalla codifica - il primo bit indica il segno del numero rappresentato - molto facilitate operazioni di somma e sottrazione algebrica (vediamo poi perché) -6- Esempio: codifica su 4 bit, -8 ≤ P ≤ 7 +7 0111 +6 0110 +5 0101 +4 0100 +3 0011 +2 0010 +1 0001 0 0000 -1 1111 -2 1110 -3 1101 -4 1100 -5 1011 -6 1010 -7 1001 -8 1000 NB: bit più significativo è indicativo del segno: 0 ⇒ valore ≥ 0 1 ⇒ valore < 0 ma non è il segno: cambiandolo non si ottiene il numero opposto -7- Proprietà importante della codifica binaria in complemento (es. per N = 4): Rappresentazione di –X = 10000 – X = 1111 – X + 1 e la differenza 1111 – X si ottiene invertendo tutti i bit di X Esempio: X = 0110 (6 in decimale) ⇒ 1111 – X = 1001 ⇒ -6 in cpl2: 1001 + 1 = 1010 Operazione di complementazione di un numero: calcolo della codifica in cpl2 dell’opposto di un numero dato realizzabile in modo molto efficiente da un circuito semplicissimo ⇒ adottando codifica cpl2 calcolatore usa solo circuito per addizione (più quello banale di complementazione) per fare sia somma sia sottrazione Somma algebrica Dati due numeri interi in base 10 da sommare algebricamente, come prima operazione occorre valutare il numero di bit necessari per la loro rappresentazione in compl2. Il numero di bit può essere: • fissato a priori (ad esempio N=8 bit). In tale caso, occorre verificare che il numero di bit sia sufficiente per rappresentare entrambi gli operandi; • variabile => occorre calcolare il numero minimo N di bit per poter rappresentare tutti e due. Alcuni esempi: Esempio 1: somma senza riporto nè overflow -7 + (+2) = -5 con N=4 (i numeri rappresentabili sono -8<=P<=+7); si ottiene: 1001+ 0010= 1 0 1 1 (-5) Esempio 2: somma con riporto, ma senza overflow +7 + (-2) = +5 con N=4 (i numeri rappresentabili sono -8<=P<=+7); si ottiene: 0111+ -8- 1110= 1 0 1 0 1 (+5) Attenzione: il riporto (o ribocco) deve essere sempre trascurato. La presenza di overflow non è indicata dalla presenza del riporto, come si vedrà nell’esempio successivo. Esempio 3: somma con overflow +7 + (+2) = +9 con N=4 (i numeri rappresentabili sono -8<=P<=+7); si ha overflow perchè +9 è un numero relativo non rappresentabile su 4 bit in complemento a 2. si ottiene: 0111+ 0010 = 1 0 0 1 ( + 9) Si ha overflow perchè, a partire da due operandi entrambi positivi (bit più significativo pari a 0), si ottiene un risultato che ha segno discorde (bit più significativo pari a 1). Come si può notare, si ha overflow anche senza la presenza di un riporto. Esempio 4: somma con overflow e riporto -7 + (-2) = -9 con N=4 (i numeri rappresentabili sono -8<=P<=+7); si ha overflow perchè –9 è un numero relativo non rappresentabile su 4 bit in complemento a 2. si ottiene: 1001+ 1110= 1 0 1 1 1 ( - 9) Si ha overflow perchè, a partire da due operandi entrambi negativi (bit più significativo pari a 1), si ottiene un risultato che ha segno discorde (bit più significativo pari a 0). Come si può notare, in questo caso si ha sia overflow che riporto. Dunque, regola generale: il riporto va sempre trascurato. Per capire se il risultato è corretto oppure no, è necessario osservare sempre i primi N=4 bit del risultato stesso (con N pari al numero di bit utilizzato per rappresentare i due operandi). -9- Codifica di numeri reali Rappresentazione della parte decimale di un numero in base 2 Il metodo che si applica per rappresentare un numero decimale in base 2 può essere visto come il metodo duale a quello di conversione di un numero naturale in base 2. Infatti, nel caso della codifica pesata di un numero naturale si seguono i seguenti passi: 1. divisione del numero per due. Il resto diventa una porzione del risultato finale della conversione, il quoziente viene successivamente diviso per due. 2. L’ultima divisione per due si ha quando il dividendo è minore del divisore (pari a due). 3. Il risultato finale è pari alla sequenza dei resti delle divisioni per due eseguite, sequenza letta a partire dall’ultima divisione risalendo via via alla prima divisione. Nel caso di codifica pesata in base 2 della parte decimale di un numero, si compiono i seguenti passi: 1. si moltiplica (prima si divideva) la parte decimale per due. Il risultato è costituito da una parte intera (pari a 0 oppure 1) e un’eventuale parte decimale. La parte decimale viene successivamente moltiplicata per due. 2. L’ultima moltiplicazione per due che si applica è determinata dall’avverarsi di una delle due condizioni (in realtà, NON sono mutuamente esclusive, ossia potrebbero verificarsi contemporaneamente): a. L’ultima moltiplicazione per due ha portato a un risultato in cui la parte decimale è pari a zero; b. Si è superato il numero di bit adibito alla rappresentazione della parte decimale in base 2 (caso in cui il numero di bit per la parte decimale viene fissato a priori). 3. Il risultato finale è pari alla sequenza di parti intere delle moltiplicazioni per due eseguite, sequenza letta a partire dalla prima moltiplicazione in direzione dell’ultima moltiplicazione effettuata. Ad esempio: 0.625 come si rappresenta in base 2? 0.625 * 2 = 1.250 0.250 * 2 = 0.500 0.500 * 2 = 1.000 (la parte frazionaria è pari a zero => è l’ultima moltiplicazione da eseguire). Il risultato si legge dall’alto verso il basso ed è pari a 0.101. Controprova: 0.101 (2) = 1 * 2^ (1/2) + 0 * 2^ (1/4) + 1 * 2^ (1/8) = 0.625. Rappresentazione in virgola fissa numero fisso di cifre dedicato alla parte intera e a quella frazionaria molto semplice, relativamente poco interessante - 10 - giustapposti due numeri, uno rappresenta la parte intera, uno quella decimale entrambi rappresentati con codifica posizionale proprio come nell’ usuale rappresentazione dei numeri decimali in base 10 Esempio: disponibile 16 bit, 11 allocati alla parte intera, 5 alla parte decimale configurazione 0010100101110110 corrisponde a numero (binario posizionale) 00101001011.10110 che in notazione decimale è 1 ⋅ 28 + 1 ⋅ 26 +1 ⋅ 23 +1 ⋅ 21 +1 ⋅ 20 + 1 ⋅ 2-1 + 1 ⋅ 2-3 + 1 ⋅ 2-4 = 256 + 64 + 8 + 2 + 1 + 0.5 + 0.125 + 0.0625 = 331.6875 Caratteristiche della codifica in virgola fissa (da confrontare con la codifica in virgola mobile) campo di valori rappresentabili relativamente ristretto valori rappresentabili distribuiti uniformemente ⇒ errori di approssimazione costanti in tutto l’intervallo rappresentato - 11 - Codifica in virgola mobile (floating point) Del tutto simile a cosiddetta notazione scientifica o esponenziale per rappresentare in modo compatto numeri molto piccoli o molto grandi e.g. massa dell’elettrone è 9.1095 × 10 –31 Kg separate parti che descrivono ordine di grandezza (potenza di una data base: 10-31) precisione con cui è noto il valore (cifre significative: 9.1095) ogni numero razionale R esprimibile come segue prendendo qualunque base b > 1 E R=M•b R - valore razionale M - mantissa frazionaria con segno b - base E - esponente intero con segno Idea di massima della codifica in virgola mobile data base b, numero razionale rappresentato in virgola mobile con E M dove M rappresentazione della mantissa nella base b e con un certo numero di cifre E rappresentazione, pure nella base b, dell’esponente da dare alla base Caratteristiche Il campo di valori rappresentabili dipende da E la risoluzione (precisione) dipende da M - 12 - Standard IEEE 754-1985 S E M bit destinati alla rappresentazione divisi in - un bit per il segno della mantissa – parte S (0 = +, 1 = -) - alcuni bit per l’esponente – parte E - altri bit per la mantissa (il uso valore assoluto) – parte M Problema: il segno dell’esponente notazione “eccesso K”: si memorizza il valore dell’esponente aumentato di K se k bit dedicati all’esponente, K = 2k-1 - 1 e.g., k = 8 si memorizza esponente aumentato di K = 27 – 1 = 127 ⇒ valore memorizzato 0: esponente = -127; 255: esponente = 128; 132: esponente = 5 Inoltre, Mantissa viene normalizzata: scegliendo esponente opportuno, posta a un valore (binario) tra 1.00000... e 1.11111... il valore 1 sempre presente può essere sottinteso ⇒ guadagno di un bit di precisione previsti tre possibili gradi di precisione: singola, doppia, quadrupla Campo ampiezza totale in bit Precisione singola Precisione doppia Precisione quadrupla 32 64 128 Segno 1 1 1 Esponente 8 11 15 Mantissa 23 52 111 massimo E 255 2047 32767 minimo E 0 0 0 127 1023 16383 di cui K Il valore rappresentato vale quindi X = (-1)S × 2E-K × 1.M - 13 - Esempio di rappresentazione in precisione singola X = 42.687510 = 101010.10112 = 1.010101011 × 25 Si ha S=0 (1 bit) E = 5 + K = 510 + 12710 = 132 = 100001002 (8 bit) M = 01010101100000000000000 (23 bit) NB. I circa 4 miliardi di configurazioni dei 32 bit usati consentono di coprire un campo di valori molto ampio grazie alla distribuzione non uniforme. Proprietà fondamentale per numeri piccoli in valore assoluto valori rappresentati sono «fitti», per numeri grandi in valore assoluto valori rappresentati sono «diradati» Approssimativamente gli intervalli tra valori contigui sono: • per valori di 10000 l’intervallo è di un millesimo • per valori di 10 milioni l’intervallo è di un’unità • per valori di 10 miliardi l’intervallo è di mille • ecc. - 0 + Codifica esadecimale (HEX) codifica pesata dei numeri naturali in base B=16 ⇒ disponibili 16 valori delle cifre. - 14 - valore cifra hex binario 0 0 0000 1 1 0001 2 2 0010 3 3 0011 4 4 0100 5 5 0101 6 6 0110 ESEMPIO 7 7 0111 binario 0110 1001 1101 0100 8 8 1000 HEX 9 9 1001 10 A 1010 11 B 1011 Generalmente si premette uno «0» iniziale e una «h» finale. 12 C 1100 cioè 069D4h 13 D 1101 14 E 1110 15 F 1111 La comodità della rappresentazione HEX sta nella facilità di conversione in binario e viceversa: ogni gruppo di 4 bit corrisponde direttamente ad una cifra HEX, come nella tabella accanto. 6 9 D 4 valore di un numero esadecimale si ottiene dalla relazione (N è il numero di cifre esadecimali): P16=bN-1 16N-1+bN-2 16N-2+......+b2 162+b1 161+b0 160 Sequenze di 16 o 32 bit scomode da gestire e difficili da ricordare per l’uomo ⇒ usata generalmente rappresentazione esadecimale (in particolare nel linguaggio Assembler) Rappresentazione dei caratteri alfanumerici Si devono rappresentare: • lettere maiuscole/minuscole A a .. Z z • spazio • cifre 0 .... 9 - 15 - • segni di interpunzione , : ; . • simboli ! « # % @ ) < = • caratteri di controllo per gestire la visualizzazione, la stampa, la trasmissione dei caratteri (inizio riga, salto di riga, salto pagina ....) codifica standard universalmente accettata è codifica ASCII (American Standard Code for Information Interchange) Codifica ASCII • 7 bit per rappresentare ogni carattere => 128 caratteri alfanumerici distinti: le possibili configurazioni vanno da 0000000 a 1111111 • la codifica è stata scelta in modo da rispettare alcune «proprietà» dei caratteri: o ordinamento delle cifre o ordinamento delle lettere • introduce le seguenti ulteriori proprietà: o le lettere maiuscole precedono tutte le lettere minuscole o la «distanza» tra una lettera maiuscola e la sua corrispondente minuscola è la stessa per tutte le lettere ASCII esteso • (8 bit) 256 configurazioni: o prime 128 (da 00000000 a 01111111) associate a caratteri ASCII Standard o rimanenti 128 (da 10000000 a 11111111) associate a lettere accentate..., a caratteri semigrafici ... - 16 - Tabella ASCII N.B. I valori numerici in piccolo sono il valore decimale corrispondente al codice ASCII codifica ASCII di qss carattere: 3 bit della colonna seguiti dai 4 bit della riga Esempio: carattere ‘?’ 4a colonna, ultima riga 011 1111 => 63 - 17 -