Dispensa sulla codifica dell`informazione

annuncio pubblicitario
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 -
Scarica