Rappresentazione di numeri interi e frazionari 28 settembre 2015 (ore 9-11)
Punto della situazione Vogliamo «dialogare» col computer: impariamo le rappresentazioni in binario Abbiamo visto la rappresentazioni degli interi positivi in binario e più in generale in notazione posizionale e alcuni algoritmi di conversione Oggi vedremo: la rappresentazione in base 8 e in base 16; la rappresentazione dei numeri con la virgola; il codice ASCII.
Avviso Giovedì 1 ottobre: lezione 9-13 Venerdì 2 ottobre: niente lezione!
Notazione binaria per numeri naturali In base 2. I simboli ammessi sono 0,1. Una sequenza / stringa di 0 e 1, di lunghezza n con a i {0, 1} per i = 0, 1,, n-1 rappresenta l intero N: a n-1 a n-2 a 1 a 0 N = (a n-1 a n-2 a 1 a 0 ) 2 = = a n-1 2 n-1 + a n-2 2 n-2 + + a 1 2 1 + a 0 2 0 In notazione compatta: N n 1 i 0 a i 2 i
Notazione posizionale (in base b generica) In base b. I simboli ammessi sono 0,1,, b-1. Una sequenza / stringa di 0, 1,, b-1, di lunghezza n a n-1 a n-2 a 1 a 0 con a i {0, 1,, b-1} per i = 0, 1,, n-1 rappresenta l intero N: N = (a n-1 a n-2 a 1 a 0 ) b = = a n-1 b n-1 + a n-2 b n-2 + + a 1 b 1 + a 0 b 0 In notazione compatta: N n 1 i 0 a i i b
Esempi (234) 10 (234) 8 2 2 10 3 10 4 2 2 8 3 8 4 234 156 10 10 (234) 16 2 2 16 3 16 4 564 10 (101) 10 (101) 8 2 1 10 0 10 1 2 1 8 0 8 1 101 65 10 10 (101) 2 2 1 2 0 2 1 5 10
Algoritmo di conversione: decimale in binario N = (a n-1 a n-2 a 1 a 0 ) 2 Dato N trovare a n-1, a n-2,, a 1, a 0 con a i = 0 o 1 Procedura inversa: dall alto verso il basso da a 0 ad a n-1 ; da LSD a MSD N= S 0 = S 1 2 +a 0 a 0 ed S 1 sono rispettivamente il resto e il quoziente della divisione di N= S S 1 = S 2 2 + a 0 per 2. 1 S 2 = S 3 2 + a 2 S i = S i+1 2 + a i S n-2 = S n-1 2 + a n-2 S n-1 = a n-1. a i ed S i+1 sono rispettivamente il resto e il quoziente della divisione di S i per 2.. Fino ad ottenere un S i =0. Algoritmo delle divisioni successive
Esempio 1 (decimale in binario) N=152 S 0 = N = a 0 +2 S 1 S 1 = a 1 + 2 S 2 S 2 = a 2 + 2 S 3.. S i = a i + 2 S i+1.. S n-1 = a n-1 N = (a n-1 a n-2 a 1 a 0 ) 2 S 0 = a 0 +2S 1 = 0 + 2 76 = 152 S 1 = a 1 +2S 2 = 0 + 2 38 = 76 S 2 = a 2 +2S 3 = 0 + 2 19 = 38 S 3 = a 3 +2S 4 = 1 + 2 9 = 19 S 4 = a 4 +2S 5 = 1 + 2 4 = 9 S 5 = a 5 +2S 6 = 0 + 2 2 = 4 S 6 = a 6 +2S 7 = 0 + 2 1 = 2 S 7 = a 7 +2S 8 = 1 + 2 0 =1 N = (10011000) 2 152 : 2 = 76 con resto 0 76 : 2 = 38 con resto 0 38 : 2 = 19 con resto 0 19 : 2 = 9 con resto 1 9 : 2 = 4 con resto 1 4 : 2 = 2 con resto 0 2 : 2 = 1 con resto 0 1 : 2 = 0 con resto 1 STOP
Conversione da decimale a base B
Numero di bit per rappresentare N E possibile prevedere il numero di bit necessari per rappresentare N in binario? Potevamo prevedere che per rappresentare N = 152 occorrevano 8 bit? E possibile rappresentare 152 con 7 bit? No, perché con 7 bit possiamo rappresentare tutti e soli gli interi da 0 a 2 7-1=127 E possibile rappresentare 152 con 8 bit? Si, perché con 8 bit possiamo rappresentare tutti gli interi da 0 a 2 8-1 = 255 In effetti: 2 7-1< 152 <= 2 8-1. Il minimo numero di bit necessari a rappresentare N in binario lo ottengo considerando log 2 N, arrotondandolo al più grande intero inferiore e sommando 1. log 2 152 = 7,. che arrotondato inferiormente dà 7, sommando 1: 8. Nota: 152 si può rappresentare anche con 9, 10, 11,.. bit: (152) 10 = (10011000) 2 = (010011000) 2 = (0010011000) 2 = (00010011000) 2
Notazione in base 8 / ottale In base 8. I simboli ammessi sono 0,1,, 7. Una sequenza / stringa di 0, 1,, 7, di lunghezza n a n-1 a n-2 a 1 a 0 con a i {0, 1,, 7} per i = 0, 1,, n-1 rappresenta l intero N: N = (a n-1 a n-2 a 1 a 0 ) 8 = = a n-1 8 n-1 + a n-2 8 n-2 + + a 1 8 1 + a 0 8 0 In notazione compatta: N n 1 i 0 a i 8 i
Conversione da ottale in decimale b = 8 rappresentazione ottale 2 (213) 8 2 8 1 8 3 139 010 001 011 Convertiamolo in decimale 2 7 +2 3 +2 1 +2 0 = =128+8+2+1 = 139 Valore identico 0 1 2 3 4 5 6 7 000 001 010 011 100 101 110 111 Sarà un caso?
Non è un caso! 0 1 0 0 0 1 0 1 1 = = (0 2 8 + 1 2 7 + 0 2 6 )+ (0 2 5 + 0 2 4 + 1 2 3 )+(0 2 2 + 1 2+ 1) = = (0 2 2 + 1 2 1 + 0) 2 6 + (0 2 2 + 0 2 1 + 1) 2 3 +(0 2 2 + 1 2+ 1) = = 2 2 6 + 1 2 3 + 3 2 0 = = 2 8 2 + 1 8 1 + 3 8 0 = ( 2 1 3) 8
Da binario a ottale N = (a 7 a 6 a 1 a 0 ) 2 = a 7 2 7 + a 6 2 6 + + a 1 2+ a 0 = (a 7 2 7 + a 6 2 6 )+ (a 5 2 5 + a 4 2 4 + a 3 2 3 )+(a 2 2 2 + a 1 2+ a 0 ) = = (a 7 2 1 + a 6 ) 2 6 + (a 5 2 2 + a 4 2 1 + a 3 ) 2 3 +(a 2 2 2 + a 1 2+ a 0 ) = = b 2 8 2 + b 1 8 1 + b 0 8 0 E inoltre b 2, b 1, b 0 sono compresi fra 0 e 7. (a 7 a 6 a 1 a 0 ) 2 = ( b 2 b 1 b 0 ) 8
Da binario ad ottale e viceversa Da binario ad ottale: Raggruppa i bit 3 a 3 da destra Ad ogni gruppo fai corrispondere la cifra in ottale (da 0 a 7) Da ottale a binario: Ad ogni cifra in ottale far corrispondere la rappresentazione binaria e concatenare Esempi:
Notazione in base 16 / esadecimale In base 16. I simboli ammessi sono 0,1,, 9, A, B, C, D, E, F. Una sequenza / stringa di 0, 1,, F, di lunghezza n a n-1 a n-2 a 1 a 0 con a i {0, 1,, F} per i = 0, 1,, n-1 rappresenta l intero N: N = (a n-1 a n-2 a 1 a 0 ) 16 = = a n-1 16 n-1 + a n-2 16 n-2 + + a 1 16 1 + a 0 16 0 In notazione compatta: N n 1 i 0 a i 16 i
Esempi (15F ) 16 = 1 16 2 + 5 16 1 + 15 16 0 = = 256+80+15 = 351 (C1A0 ) 16 = 12 16 3 + 1 16 2 + 10 16 1 + 0 16 0 = = 12 4.096+ 256 +160 = 49.568 (FFF ) 16 = 15 16 2 + 15 16 1 + 15 16 0 = = 4095 = 16 3 1 A = 10 B = 11 C = 12 D = 13 E = 14 F = 15 Per ottenere la rappresentazione esadecimale di un intero eseguo divisioni successive per 16 Es.: (675) 10 675 = 42 16 + 3 42 = 2 16 + 10 2 = 0 16 + 2 (675) 10 = (2A3 ) 16
Conversione diretta da esadecimale a binario b = 16 rappresentazione esadecimale 2 (203) 16 2 16 3 515 0010 0000 0011 2 9 2 1 1 515 Nemmeno questo è un caso!
Da binario a esadecimale e viceversa Da binario ad esadecimale: Raggruppa i bit 4 a 4 da destra Ad ogni gruppo fai corrispondere la cifra in esadecimale (da 0 a F) Da ottale a binario: Ad ogni cifra in esadecimale far corrispondere la rappresentazione binaria e concatenare Esempi: La motivazione è analoga a quella del caso ottale
Rappresentazione dei numeri con la virgola
Rappresentazione dei numeri con parte decimale Per rappresentare numeri con la virgola normalmente usiamo ancora il Il peso della cifra cambia sulla base della posizione Sistema Posizionale Pesato N = (a n-1 a n-2... a 1 a 0, a -1 a -2... a -m ) b (2425, 295 ) 10 2 10 3 + 4 10 2 + 2 10 1 + 5 10 0 + 2 10-1 + 9 10-2 + 5 10-3 Rappresentazione decimale
Sistema posizionale pesato N = (a n-1 a n-2... a 1 a 0, a -1 a -2... a -m ) b a i 0,1,2,..., b 1 b è chiamata base o radice Il valore di N sarà N n 1 i m a i i b N = (a n-1 a n-2... a 1 a 0, a -1 a -2... a -m ) b MSD della parte intera MSD= Most Significant Digit LSD = Less Significant Digit «Significant» rispetto al suo peso a i LSD della parte intera MSD della parte frazionaria LSD della parte frazionaria
Rappresentazione binaria (1011,110) 2 N = 1 2 3 + 0 2 2 + 1 2 1 + 1 2 0 + 1 2-1 + 1 2-2 + 0 2-3 Rappresentazione binaria N = 11, 75 ½ + ¼ = 3/4 = 0,75
Rappresentazione dei numeri decimali N = (a n-1 a n-2... a 1 a 0, a -1 a -2... a -m ) 2 a n-1 2 n-1 +a n-2 2 n-2 + + a 1 2 1 + a 0 2 0 + a -1 2-1 + + a -m 2 -m intero Frazione propria della forma 0,. cioè compresa fra 0 e 1
Conversione di frazioni: binario in decimale (0, a -1 a -2 a -m ) 2 Esempio: N = a -1 2-1 + a -2 2-2 + + a -m 2 -m N= (0,0011101) 2 N = 2-3 + 2-4 + 2-5 + 2-7 = 0,2265625
Da decimale a binario N = a -1 2-1 + a -2 2-2 + + a -m 2 -m 2 N = a -1 + ( a -2 2-1 + + a -m 2 -(m-1) ) Abbiamo isolato la MSD a -1 e S -1 = ( a -2 2-1 + + a -m 2 -(m-1) ) è una frazione propria Possiamo ripetere il procedimento per isolare a -2 2 S -1 = a -2 + (a -3 2-1 + a -m 2 -(m-1) ) etc etc.. dalla cifra più significativa alla meno
Conversione di Frazioni proprie: decimale in binario Dato N, trovare a -1, a -2,, a -m tale che N = (0, a -1 a -2 a -m ) 2 S 0 =N 2 S 0 = a -1 +S -1 2 S -1 = a -2 + S -2 2 S -2 = a -3 + S -3.. 2 S -i = a -(i+1) + S -(i+1).. Fino a quando? Fino a quando trovo un valore di S -i = 0 oppure abbia esaurito il numero di cifre a disposizione per la rappresentazione: approssimazione
Esempio 0,234 2 0,234 = 0 + 0,468 2 0,468 = 0 + 0,936 2 0,936 = 1 + 0,872 2 0,872 = 1 + 0,744 2 0,744 = 1 + 0,488 2 0,488 = 0 + 0,976 2 0,976 = 1 + 0,952 Decimale->Binario (0,0011101 ) 2
Vedremo poi la notazione in virgola mobile
Codifica informazioni non numeriche
Codice ASCII
Preparata p. 39
Esempio
Avviso Giovedì 1 ottobre: lezione 9-13 Venerdì 2 ottobre: niente lezione!