Rappresentazione dell’informazione nel calcolatore. Alessandro Bozzola MATERIALE TRATTO DA: http://webcen.usr.dsi.unimi.it/infogenerale/ http://www.lta.disco.unimib.it/didattica/InfoGen/ Introduzione A livello di circuiti logici i calcolatori memorizzano (e rappresentano) valori basati su bit, gestiscono quindi zeri(Vlow)e uni(Vhigh). Poiché a noi interessa memorizzare ed elaborare numeri, parole, immagini, suoni, ecc. Occorre progettare un sistema che consenta di rappresentare le informazioni interessanti in termini di bit (forma binaria). Introduzione (cont…) Vedremo quindi come si rappresentano le informazioni fondamentali: numeri e caratteri. Daremo dei cenni sulla rappresentazione di informazioni più sofisticate e complesse. La rappresentazione dei numeri Cominciamo con i numeri interi non negativi (numeri naturali + lo zero) Gli interi non negativi sono rappresentabili con diverse notazioni: additiva romana: I, II, III, IV, V, .... IX, X, XI... posizionale indo-araba: 1, 2, .. 10, 11, ... 100, Il valore dei numeri dipende da regole specifiche della rappresentazione. Notazioni posizionali Ogni simbolo contribuisce con un valore che dipende dalla sua posizione e dalla base di rappresentazione B. Ad esempio, dato il numero (dk dk-1...d1 d0) in una base qualsiasi B, troviamo il valore espresso in base 10 dalla formula: d 0 B d1B d 2 B d 3 B ... 0 1 2 3 Notazione posizionale decimale Per noi è consuetudine rappresentare i numeri con la notazione posizionale decimale, che utilizza le 10 cifre 0,1,..9 (numeri arabici). Un numero è rappresentato da una sequenza di cifre, posizionale significa che il valore di ogni cifra dipende dalla sua posizione all'interno della sequenza, ad esempio: E' possibile scegliere il numero di cifre differenti che si usano in una notazione posizionale, e tale numero prende il nome di base; in ogni numero decimale (in base dieci) la cifra all'estrema destra ha il valore minore (cifra meno significativa) , quella all'estrema sinistra il valore maggiore (cifra più significativa). In genere si usano anche numerazione binaria in base 2, ottale in base 8, esadecimale in base 16. Altre basi Ogni numero è esprimibile in modo univoco in una qualunque base: Stringa 13 13 13 13 – Base Calcolo del valore 4 4*1+3 8 8*1+3 10 10 * 1 + 3 16 16 * 1 + 3 Valore in base 10 7 11 13 19 Basi di particolare interesse: base B=2 due sole cifre: 0 e 1 base B=8 otto cifre: 0, 1, 2, 3, 4, 5, 6, 7 base B=10 dieci cifre: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 base B=16 sedici cifre: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F Conversioni tra basi differenti: Algoritmo delle divisioni successive Dato un numero N in base dieci, per convertirlo in una stringa di caratteri che ne rappresenti la codifica in base B si opera per divisioni successive, calcolando i caratteri della stringa dal meno significativo al più significativo. Esempi, da base 10 a base 2: Convertiamo (11)10 in base 2. N resti 11 1 5 1 2 0 1011 = 1*2^3+0*2^2+1*2^1+1*2^0 = 0 1 = 8 + 2 + 1 = 11 Esempio da base 10 a 16 e viceversa: • Conversione del numero 44 in base 16 44:16 = 2 con resto 12 dove 1210corrisponde a C16 2:16 = 0 con resto 2 Quindi 4410 corrisponde a 2C16. Verifica: 2 * 16^1 + C * 16^0 = 32 + 12 = (44)10 Un altro esempio: Convertiamo (49)10 in base 2.. N resti 49 1 24 0 12 0 110001 = 1+16+32 = 49 6 0 3 1 1 1 0 Vediamone un altro: Convertiamo (57)10 in base 4. N resti 57 1 14 2 3 3 321 = 3*4^2+2*4^1+1*4^0 = 0 = 3*16+2*4+1 = = 48 + 8 +1 = 57 Conversione tra ottale, esadecimale e binario I sistemi di numerazione ottale ed esadecimale hanno la proprietà di convertirsi in modo facile in binario e viceversa. Infatti, una cifra ottale richiede esattamente tre cifre binarie per la sua rappresentazione, mentre una cifra esadecimale richiede quattro cifre binarie per la sua rappresentazione. Per esempio, il numero ottale 1238 si converte facilmente in 0010100112: il numero esadecimale 3C16 si converte facilmente in 001111002 Tabella riassuntiva: conversione rapida binario-ottale, binario-esadecimale: Conversioni per numeri frazionari: E' importante far notare che per i numeri interi si usa il metodo appena descritto delle divisioni successive; per i numeri frazionari si usa per la parte a sinistra della virgola (parte intera) il metodo dellle divisioni successive e per la parte a destra dellla virgola (parte frazionaria) il metodo delle moltiplicazioni successive. Con tale metodo si prende come cifra binaria la parte intera e si moltiplica per 2 la parte decimale fino a quando la parte frazionaria è diventata nulla o quando si sia trovato un numero sufficiente di cifre binarie. Metodo delle moltiplicazioni successive: • Conversione del numero 0.65625 in base 2 0.65625*2 = 0.31250*2 = 0.62500*2 = 0.250*2 = 0.5*2 = 1.31250 0.62500 1.250 0.500 1.00 con resto 1 con resto 0 con resto 1 con resto 0 con resto 1 Il risultato è: 0.6562510 = 101012 Operazioni nel sistema di numerazione binario: Somma: 0+0 = 0 0+1 = 1 1+0 = 1 1+1 = 0 con riporto 1 Per la somma di due numeri positivi di lunghezza K possono essere necessari K+1 bit. Se sono disponibili solo K cifre si genera un errore di overflow (o trabocco). Esempio di somma binaria: A = 110112 =2710 B = 001102 =610 overflow Verifica: 1 1 0 1 12+ 0 0 1 1 02 = -------------1 0 0 0 0 12 2710 + 610 = 3310 1000012 = 1*2^5 + 1* 2^0 = 1* 32 + 1 * 1 = 3310 Prodotto: 0*0 = 0 0*1 = 0 1*0 = 0 1*1 = 1 Esempio: A =10112=1110 B = 11012=1310 1011* 1101= ----------1011 + 00000 + 101100 + 1011000 -------------10001111 Sottrazione: 0-0=0 1-1=0 1-0=0 0 - 1 = 0 con prestito di uno. Esempio: A =11002= 1210 B =00112= 310 11002 – 00112= --------1001 Divisione: La classica domanda "quante volte il dividendo sta in una certa parte del divisore", può solo avere due risposte: 0, cioè non ci sta, oppure 1, cioè ci sta, perché è più piccolo. Esempio: A =100101102=15010 B =11002 = 1210 100101102 : 11002 = ? Procedimento della divisione: - Si cerca la prima parte del dividendo che sia maggiore del divisore. Tale prima parte è nel nostro caso 10010, e dobbiamo scrivere 1 al quoziente, calcolando il resto come differenza 10010-1100. Si ottiene 110… 10010110 : 1100 1100 ----------------1 110 Procedimento della divisione, cont: …a questo punto "si abbassa" la cifra successiva del dividendo, cioè 1, ottenendo 1101. Il divisore 1100 "sta" nel 1101, ovviamente una volta e con resto 1… 10010110 : 1100 1100 ----------------11 1101 1100 ------1 Procedimento della divisione, cont: …il quoziente diviene 11 e abbassando la cifra successiva 1 si ha 11. Questa volta il divisore "non sta" in questa parte del dividendo e quindi si aggiunge uno 0 al quoziente… 10010110 : 1100 1100 ----------------110 1101 1100 ------11 Procedimento della divisione, cont: …si prosegue abbassando la cifra successiva. Questo è l'ultimo 0, che dà 110 nel dividendo. Di nuovo il 1100 non sta nel 110 e perciò si aggiunge un altro 0 al quoziente. 10010110 : 1100 1100 ----------------1100 1101 1100 ------110 Non essendoci più cifre da calare ciò significa che l'operazione è finita: quindi il quoziente è 11002=1210, il resto è 1102=610. Rappresentazione dei numeri nel calcolatore: Nella rappresentazione dei numeri attraverso il sistema binario sorgono due problemi: rappresentazione dei numeri troppo grandi o troppo piccoli. E' possibile rappresentare solo i numeri compresi in un intervallo finito, compreso tra la soglia minima di underflow e la soglia massima di overflow Rappresentazione dei numeri periodici e dei numeri razionali. E' possibile rappresentare solo una parte, ovviamente la più significativa incorrendo in un errore di troncamento Rappresentazione dei numeri con segno. Se utilizziamo 16 bit per codificare un numero avremo a disposizione 65536 combinazioni. Possiamo: – rappresentare i numeri naturali da 0 a 65535, – rappresentare i numeri relativi (con segno) da 32768 a +32767. Come facciamo? Considerando 16 bit, il primo bit di questi, detto bit più significativo (MSB Most Significant Bit) a disposizione viene utilizzato per il segno: 1 -> numero negativo; 0 -> numero positivo Allora se il primo bit é 0, i rimanenti 15 bit rappresentano un numero positivo da 0 a 32767 Se il primo bit é 1 i rimanenti 15 bit li possiamo usare per rappresentare 32768 numeri negativi