2. Codifica dell informazione Codifica Una codifica è una regola per associare in modo univoco i valori di un dato da codificare con sequenze di simboli. La corrispondenza definita dalla codifica è arbitraria, è una convenzione. Essa deve pertanto essere nota e rispettata da chi genera e da chi utilizza i dati. A tale scopo vengono definiti degli standard. 1
Codifica binaria In un calcolatore i dati sono rappresentati in forma binaria con sequenze di bit, ovvero sequenze di due soli simboli: 0 e 1. Bisogna perciò poter associare univocamente ad ogni dato elementare (numeri, caratteri, ) una sequenza di bit che lo rappresenti. Codifica binaria Alfabeto (insieme dei simboli utilizzabili) costituito da cifre 0 e 1. Con N cifre binarie si possono codificare 2 N configurazioni diverse e pertanto si possono rappresentare al più 2 N valori distinti. Per rappresentare M valori distinti sono necessarie N = log 2 M cifre binarie. 2
Codifica binaria: esempi Con 4 cifre binarie posso rappresentare 2 4 = 16 valori distinti. Per rappresentare i 7 giorni della settimana, occorrono N = log 2 7 = 3 cifre binarie. Una possibile codifica è ad esempio: Lunedì 000 Venerdì 100 Martedì 001 Sabato 101 Mercoledì 010 Domenica 110 Giovedì 011 Codifica binaria dei numeri Distinguiamo la rappresentazione per: numeri naturali (interi positivi) numeri interi con segno numeri reali 3
Numeri interi positivi La codifica si basa sulla notazione posizionale o pesata adottata usualmente per i numeri codificati in decimale. Nella notazione posizionale il valore numerico rappresentato da una cifra dipende dal valore della cifra e dalla sua posizione nel numero. Data una base B, le cifre c k possono assumere i valori da 0 a B - 1. Numeri interi positivi In notazione posizionale un numero X di N cifre si può esprimere in base B come: X = N 1 k = 0 c k B k = c B 0 0 + c B 1 1 +... + c N 1 B N 1 Ad esempio 1328 10 = 1 10 3 + 3 10 2 + 2 10 1 + 8 10 0 356 8 = 3 8 2 + 5 8 1 + 6 8 0 = 192 + 40 + 6 = 238 10 4
Numeri interi positivi Nel caso binario (base B = 2), una sequenza di bit b n-1...b 1 b 0 rappresenta il numero: n 1 i= 0 b i n 1 i = 2 bn 1 +... + 4 b2 + 2 b1 + 2 b 0 Dati n bit è possibile rappresentare numeri da 0 a 2 n -1 (con 8 bit): 00001001 rappresenta il numero 9 (2 3 +1 = 8 + 1) Rappresentazione a 4 bit dei numeri interi positivi tra 0 e 15: Base 10 Base 2 Base 10 Base 2 0 0000 8 1000 1 0001 9 1001 2 0010 10 1010 3 0011 11 1011 4 0100 12 1100 5 0101 13 1101 6 0110 14 1110 7 0111 15 1111 5
Numeri interi positivi Per calcolare la rappresentazione binaria di un numero intero positivo lo si divide successivamente per 2 (fino ad ottenere 0), scrivendo da destra a sinistra il resto della divisione. La sequenza di 0 e 1 ottenuta dai resti della divisione, costituisce la rappresentazione binaria del numero. Si calcoli la rappresentazione binaria a 8 bit del numero decimale 125: - 125 / 2 = 62 resto 1-62 / 2 = 31 resto 0-31 / 2 = 15 resto 1-15 / 2 = 7 resto 1-7 / 2 = 3 resto 1-3 / 2 = 1 resto 1-1 / 2 = 0 resto 1 = > 01111101 Controprova: 01111101 = 0 2 7 + 1 2 6 + 1 2 5 + 1 2 4 + 1 2 3 + 1 2 2 + 0 2 1 + 1 2 0 = 64 + 32 + 16 + 8 + 4 + 1 = 125 6
Interi con segno I numeri interi con segno sono rappresentati tramite diverse codifiche Le codifiche più usate sono: codifica segno-valore codifica complemento a 1 codifica complemento a 2 Codifica segno-valore Il primo bit rappresenta il segno, gli altri il valore. (con 8 bit): 10001001 rappresenta -9 Comporta una doppia rappresentazione dello zero: 00000000 e 10000000 I numeri rappresentati appartengono all intervallo -(2 n-1-1) +(2 n-1-1) Occorre usare due diversi algoritmi per la somma a seconda che il segno degli addendi sia concorde o discorde 7
Rappresentazione in segno e valore a 4 bit dei numeri interi tra -7 e 7: Base 10 Base 2 Base 10 Base 2 0 1000 0 0000-1 1001 1 0001-2 1010 2 0010-3 1011 3 0011-4 1100 4 0100-5 1101 5 0101-6 1110 6 0110-7 1111 7 0111 Somma tra addendi concordi in segno: Somma tra addendi discordi in segno: 0011 + 0010 = 0101 3 + 2 = 5 OK 0011 + 1010 = 1101 3 + (- 2) = -5!? La somma tra addendi discordi in segno dà risultati non corretti! 8
Complemento a 1 Un numero negativo è rappresentato con il complemento del corrispondente numero positivo. : 11110110 rappresenta -9 (dove 00001001 rappresenta 9) Comporta una doppia rappresentazione dello zero: 00000000 e 11111111 I numeri rappresentati appartengono all intervallo -(2 n-1-1) +(2 n-1-1) Rappresentazione in complemento a 1 a 4 bit dei numeri interi tra -7 e 7: Base 10 Base 2 Base 10 Base 2 0 1111 0 0000-1 1110 1 0001-2 1101 2 0010-3 1100 3 0011-4 1011 4 0100-5 1010 5 0101-6 1001 6 0110-7 1000 7 0111 9
Ancora problemi con la somma: 0011 + 1101 = 0000 3 + (-2) = 0!? 1100 + 1101 = 1001-3 + (-2) = -6!? Per ottenere i risultati corretti occorre sommare il riporto (ovvero sommare 1). Complemento a 2 Un numero negativo è ottenuto calcolando il suo complemento e poi aggiungendo 1. : 11110111 rappresenta -9 Comporta un unica rappresentazione dello zero che è 00000000 I numeri rappresentati appartengono all intervallo -2 n-1 +(2 n-1-1) 10
Rappresentazione in complemento a 2 a 4 bit dei numeri interi tra -8 e 7: Base 10 Base 2 Base 10 Base 2-8 1000 0 0000-7 1001 1 0001-6 1010 2 0010-5 1011 3 0011-4 1100 4 0100-3 1101 5 0101-2 1110 6 0110-1 1111 7 0111 Ora la somma dà risultati corretti! 0011 + 0010 = 0101 3 + 2 = 5 0011 + 1110 = 0001 3 + (- 2) = 1 1101 + 1110 = 1011-3 + (-2) = -5 11
Ancora due somme: 0101 + 0110 = 1011 5 + 6 = -5!? 1100 + 1010 = 0110-4 + (-6) = 6!? In realtà con 4 bit si possono rappresentare numeri tra -8 e +7. I risultati corretti (11 e -10) sono fuori da questo intervallo (overflow). Numeri Reali Due tipi di rappresentazione: Rappresentazione in virgola fissa (fixed point) Rappresentazione in virgola mobile (floating point) 12
Numeri Reali Rappresentazione in virgola fissa: Un numero reale è rappresentato come una coppia di numeri interi, uno per la parte intera e uno per la parte frazionaria. Un numero fisso di bit è dedicato a ciascuna delle due parti. : 4 bit per la parte intera e 4 bit per la parte frazionaria: 01101011 = 0110.1011 2 = 0 2 3 + 1 2 2 + 1 2 1 + 0 2 0 + 1 2-1 + 0 2-2 + 1 2-3 + 1 2-4 = 4 + 2 + 0.5 + 0.125 + 0.0625 = 6.6875 Numeri Reali Rappresentazione in virgola mobile: m 10 e m è la mantissa ed e è l esponente 0 1...8 9......31 segno codifica per e codifica per m intervallo di rappresentazione (con 32 bit) -1.7 10 +38-0.29 10-38 e 0.29 10-38 1.7 10 +38 La codifica è dipendente dal numero di bit e dalla particolare rappresentazione binaria 13
Standard IEEE-754 E la rappresentazione (in virgola mobile) per i numeri reali adottata oggi praticamente da tutti. Codifica dei caratteri Qualunque codifica deve soddisfare: 'a' < 'b' <... < 'z' 'A' < 'B' <... < 'Z' '0' < '1' <... < '9' Continuità dei codici delle successioni 'a', 'b',..., 'z' 'A', 'B',..., 'Z' '0', '1',..., '9' Nota: non è fissa la relazione tra maiuscole e minuscole o fra i caratteri non alfabetici 14
Codifica dei caratteri Codifica ASCII (American Standard Code for Information Interchange) Comprende caratteri speciali, punteggiatura, a-z, A-Z, 0-9 Utilizza 7 bit (128 caratteri) I codici ASCII estesi usano 8 bit (256 caratteri) Codifica UNICODE Utilizza 16 bit (65536 caratteri) I primi 128 caratteri sono gli stessi di ASCII Gli altri corrispondono ad altri alfabeti (greco, cirillico, ) Non copre i simboli (oltre 200.000) di tutte le lingue! : Codifica ASCII 0 NUL 1 ^A 2 ^B 3 ^C 4 ^D 5 ^E 6 ^F 7 ^G 8 ^H 9 ^I 10 ^J 11 ^K 12 ^L 13 ^M 14 ^N 15 ^O 16 ^P 17 ^Q 18 ^R 19 ^S 20 ^T 21 ^U 22 ^V 23 ^W 24 ^X 25 ^Y 26 ^Z 27 ^[ 28 ^\ 29 ^] 30 ^^ 31 ^- 32 SP 33! 34 " 35 # 36 $ 37 % 38 & 39 ' 40 ( 41 ) 42 * 43 + 44, 45-46. 47 / 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63? 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w 120 x 121 y 122 z 123 { 124 125 } 126 ~ 127 DEL 15
Codifica esadecimale La rappresentazione esadecimale consente di esprimere lunghe sequenze binarie in modo più compatto. Ogni gruppo di 4 bit può infatti essere direttamente convertito nella corrispondente cifra esadecimale. Parole di 16 o di 32 bit possono così essere espresse in modo più conveniente rispettivamente con 4 e 8 cifre esadecimali. Codifica esadecimale Alfabeto costituito da 16 simboli. : rappresentazione esadecimale dei numeri interi positivi tra 0 e 15: Base 10 Base 16 Base 10 Base 16 0 0 8 8 1 1 9 9 2 2 10 A 3 3 11 B 4 4 12 C 5 5 13 D 6 6 14 E 7 7 15 F 16
La rappresentazione esadecimale della parola di 16 bit 0110 1100 0011 1010 è 6C3A. La rappresentazione esadecimale della parola di 32 bit 1110 0010 0001 1111 1101 1011 0000 0101 è E21FDB05 Quando nello scrivere un programma occorre specificare i dati in forma binaria, spesso si usa la rappresentazione esadecimale. 17