Sistemi di numerazione e codificazione in informatica. Redatto da Laura LENZI SISTEMI DI NUMERAZIONE I numeri sono composti da cifre e appartengono a un determinato sistema di numerazione. Tutti i sistemi di numerazione usati al giorno d’oggi sono posizionali cioè tali per cui il valore di una cifra dipende dalla sua posizione all’interno di un numero. I sistemi di numerazione servono per rappresentare una serie infinita di numeri attraverso un insieme finito di caratteri opportunamente combinati detti cifre. Il numero delle diverse cifre è uguale alla base del sistema di numerazione. Per esempio nel caso del sistema di numerazione decimale la base del sistema è costituita da dieci cifre, i numeri da 0 a 9, nel sistema binario da due (da 0 e 1), nel sistema esadecimale da sedici (da o a 9, A fino a F), nel sistema ottale (da 0 a 7). Quanto maggiore è la base, tanto minore è il numero di cifre necessario per rappresentare un numero. In generale possiamo dire che se indichiamo con B la base del sistema di numerazione le cifre che compongono tale base vanno da 0, la minima, a B-1, la massima. La crescita del valore di un simbolo a seconda della posizione occupata è in diretta relazione alla base scelta. La forma normalizzata di un numero nel sistema posizionale è: z = m*bn dove: z: numero m: mantissa b: base del sistema posizionale n: esponente Nei numeri non interi un segno di suddivisione (virgola o punto) divide la mantissa in cifre prima (a sinistra) e dopo (a destra) il segno. Nel sistema decimale la forma normalizzata è z= m* 10n . I numeri decimali possono essere rappresentati in forma abbreviata o in forma normale. Nel caso della forma abbreviata il segno di suddivisione, cioè la virgola, stabilisce il valore posizionale (o peso) delle singole cifre. Ad ogni posizione corrisponde una 1 diversa potenza del dieci. Leggendo da sinistra a destra: migliaia, centinaia, decine, unità, decimi, centesimi. Quindi se considero come esempio il numero 1992,35: 1992,35= 1*103 +9*102 +9*101 +2*100 +3*10-1 +5*10-2 Il numero ha quattro cifre prima della virgola decimale e due dopo, possiede quindi in totale 6 cifre. Nella forma normale la virgola decimale e la potenza di dieci determinano il valore posizionale delle singole cifre. Per esempio consideriamo il numero: z= 1,99235*103 che ha 6 cifre di cui una prima della virgola decimale. La forma normale può essere trasformata in altre rappresentazioni in base 10, secondo le regole di calcolo dell’aritmetica. Per esempio: z= 19,9235*102 = 199.235*101= 0,199235*104. Nel sistema binario la forma normalizzata è: z= m*2n Ci sono solo due cifre 0 e 1, il segno di suddivisione è di solito il punto anziché la virgola. Per esempio: z= 110001.012 . Ad ogni posizione corrisponde una diversa potenza del due, quindi: z= 1*25+1*24+0*23+0*22+0*21+1*20+0*2-1+1*2-2 Il numero ha otto cifre binarie di cui due dopo il punto. Nel sistema esadecimale come abbiamo già detto ci sono sedici cifre 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f; la mantissa è: z= m*16n . E’ un sistema molto usato perché è in grado di rappresentare un semibyte (4 bit) con un unica cifra: 4 celle di memoria permettono la codificazione di un numero binario a 16 cifre diverse senza segno. Per esempio z=1A3B16 . Ad ogni posizione corrisponde un diversa potenza di sedici, quindi: z= 1*163+A*162+3*161+B*160. Espresso in sistema decimale: 4096+2560+48+11=6715 z1= 1A.3B16 = 1*161+ A*160 + 3*16-1 + B*16-2 che espresso in sistema decimale è: 16+10+(3/16)+(11/256)=26,2305. Nel sistema ottale la forma normalizzata è: 2 z= m*8n Ci sono otto cifre diverse, 0,1,2,3,4,5,6,7. I numeri ottali compreso il loro segno, utilizzno completamente un semibyte (4 bit). Per esempio: z= 12348 = 1*83 +2*82 + 3*81 +4*80 = 512+128+24+4 = 66810 . Consideriamo un numero intero N costituito da n cifre nella base B, che indichiamo con (N)B, lo rappresentiamo con la sequenza ordinata di cifre (stringa): Cn-1 Cn-2 .................. C1 C0 dove la cifra generica Ci è una cifra dell’insieme finito C di n caratteri di un sistema di numerazione, C0 viene definita come la cifra meno significativa (LS: less significative) e Cn-1 è la cifra più significativa (MS: more significative). La stringa è quindi una sequenza ordinata di cifre. In generale possiamo dire che un sistema di numerazione è costituito da: 1) un insieme C finito di n caratteri detti anche simboli grafici o cifre; 2) un codice, cioè un insieme di regole che permette di associare ed interpretare un gruppo ordinato di cifre rappresentante un dato numero; 3) algoritmi per l’esecuzione delle operazioni fondamentali, cioè regole che dati i codici degli operandi permettono di ricavare il codice risultato dell’operazione. Le regole fondamentali del codice dei sistemi di numerazione sono quattro (regole con cui si scrivono i numeri): 1) le cifre sono ordinate in modo che ognuna abbia un valore di una unità più elevato di quella che la precede; 2) le cifre hanno valore posizionale (peso) cioè dipendente dalla posizione nella configurazione del numero e cresce con l’aumentare delle posizioni da destra a sinistra; 3) se la quantità da contare è superiore al numero n di cifre deve essere effettuato il riporto di 1 che si somma alla cifra immediatamente a sinistra; 4) la tecnica del riporto viene applicata alle successive cifre a sinistra. Vediamo le modalità di rappresentazione di tre tipologie di numeri diverse: a) Numeri interi. 3 Un numero intero N con n cifre lo rappresentiamo con la scrittura: Cn-1 Cn-2 ...... C1 C0. La forma polinomiale è la seguente: (N)B = Cn-1 Bn-1 + Cn-2 Bn-2 + ......... + C1B1+ C0 B0 , le cifre del nostro numero sono i coefficienti presso le corrispettive potenze della base del sistema numerico. Vediamo un esempio con B=10 caso del numero 325610 = 3*103 + 2*102 + 5*101 + 6*100 . Vediamo un altro esempio nel caso in cui invece la base sia B=2. Il numero è: 11012 = 1*23 + 1*22 + 0*21 + 1*20= (8+4+0+1)10 = 1310 Vediamo un ultimo esempio con un numero nel sistema esadecimale. Il numero è: 7C916 = 7*162 + 12*161 + 9*160 = 199310 (Bn-1 è il valore posizionale, Cn-1 è il coefficiente relativo ad ogni posizione). Nei sistemi numerici posizionali ogni cifra cambia valore a seconda della posizione. b) Numeri frazionari. Un numero frazionario N’ con m cifre lo rappresentiamo con la scrittura: 0. C-1 C-2 .......... C-(m-1) C-m dove abbiamo introdotto il punto radice (.) che sostituisce la virgola nella notazione anglosassone usata nelle applicazioni del calcolo automatico. Nel caso di numeri frazionari la forma binomiale è: (N’)B = C-1B-1+ C-2B-2 + .................+ C-m B-m. Vediamo un esempio con un numero che ha una base B=10: 0,323510 = 3*10-1+ 2*10-2 + 3*10-3 + 5*10-4. 0,1011012 = 1*2-1 + 0*2-2 + 1*2-3 + 1*2-4 + 0*2-5 + 1*2-6 = (1/2)+(1/8)+(1/16)+(1/64)= (45/64). c) Numeri misti. Un numero misto N’ lo rappresentiamo con la struttura: Cn-1 Cn-2 Cn-3 .......... C1 C0 . C-1 C-2 ........... C-m. dove Cn-1 è la cifra più significativa mentre C-m è quella meno significativa. La forma polinomiale è: 4 (N’)B = N+N’ = Cn-1Bn-1+Cn-2Bn-2+Cn-3Bn-3 + ....... + C1B1+C0B0+C-1B-1+ +C-2B-2 +.........+C-mB-m. La rappresentazione di un numero misto comprende quella di un numero intero e di un numero frazionario; per il primo, il numero m della parte frazionaria è zero ed è omesso il punto radice o comunque è inteso in modo tale da lasciare la sequenza di cifre alla sinistra, mentre per il secondo il numero di n cifre intere è nullo e il punto radice lascia alla sua destra tutte le cifre della parte frazionaria. Vediamo alcuni esempi di numeri misti: 34,5 = 3*101 + 4*100 + 5*10-1 (in base 10) 101,11 = 1*22+0*21+1*20+1*2-1+1*2-2 = 4+1+(1/2)+(1/4) = 5+(3/4) = (23/4) (in base 2) Fissata una base B (B2) esiste una corrispondenza biunivoca fra numeri e stringhe, infatti ad ogni stringa corrisponde uno e un solo numero e viceversa. Al variare della base uno stesso numero è rappresentato da stringhe diverse e una stessa stringa rappresenta più numeri. Si può dimostrare che il numero N di valori numerici rappresentabili con una stringa di n cifre di una base B è N=Bn cioè possiamo scrivere i numeri compresi fra 0 e Bn-1. Gli algoritmi di calcoli aritmetici non cambiano passando da un sistema di numerazione ad un altro. L’algoritmo della somma con sistemi numerici posizionali occorre mettere in corrispondenza le cifre che si trovano nella stessa posizione. Addizione e di sottrazione nel sistema decimale. L’addizione e la sottrazione di due numeri decimali con gli stessi esponenti avviene attraverso l’addizione/sottrazione delle due mantisse: z1 ± z2 = (m1 ± m2) * 10n Moltiplicazione e divisione nel sistema decimale. La moltiplicazione/divisione di due numeri decimali con gli stessi esponenti avviene moltiplicando/dividendo le mantisse e addizionando/sottraendo gli esponenti: z1*z2 = (m1*m2) * 10 (n1+n2) z1/z2 = (m1/m2) *10 (n1-n2) Nel caso dei numeri binari l’addizione avviene sulla base della seguente tabella: 0+0 = 0 5 0+1 = 1 1+0 = 1 1+1 = (10) 0 e riporto di 1. Vediamo un esempio: 10011011.11+11001010.01= 10011011.11+ 11001010.01= 101100110.00 La sottrazione di due numeri binari avviene come nel sistema decimale. E’ comunque più semplice effettuarla trasformando il sottraendo nel suo complemento a due e sommarlo al suo minuendo (un eventuale riporto dopo l’ultima cifra a sinistra viene ignorato). Vediamo un esempio: 11001010.0101011011.11= 101100110.10 oppure essendo il complemento a due del sottraendo 10100100.01: 11001010.01+ 10100100.01= 101100110.10 La moltiplicazione e la divisione avvengono sulla base di queste semplici regole: 0*0 = 0 0*1 = 0 1*0 = 0 1*1 = 1 L’aritmetica dei numeri esadecimali e ottali ha le stesse regole di quella dei numeri decimali. Nota: il sistema posizionale ha lo stesso algoritmo di calcolo 1 0 1 1 Accumulatore 1 0 0 1 Buffer register ALU Nel caso in cui ci siano dei riporti questi vengono memorizzati in un registro che si chiama FLAG REGISTER. La scelta del sistema di numerazione dipende dalla situazione. Normalmente nei calcoli a mano si utilizza il sistema decimale, negli elaboratori invece vengono considerati anche 6 altri aspetti come per esempio il fatto che con il sistema esadecimale richiede un minor spazio di memoria. Se si utilizza un’apparecchiatura di elaborazione dati il sistema di numerazione deve essere reso comprensibile al calcolatore. La rappresentazione dei numeri per l’uso del calcolatore è un caso particolare di codifica o codificazione. Occorre distinguere tra rappresentazione (codificazione di numeri in una forma comprensibile al calcolatore ) e conversione (trasformazione di numeri da un sistema di numerazione in un altro). Per quanto riguarda la rappresentazione cioè il fatto di codificare i numeri per renderli comprensibili al calcolatore, attualmente ci si riferisce esclusivamente al sistema binario in quanto l’elettronica dell’elaboratore è basata proprio su questo sistema di numerazione in quanto le sue componenti possono avere solo due condizioni stabili. Nel futuro le cose cambieranno in quanto nei calcolatori ottici gli elementi potranno avere più di due condizioni stabili e quindi sarà possibile una codificazione in decimale. Il difetto del sistema di numerazione binaria è che richiede troppo spazio nella memoria. I codici sono delle leggi di rappresentazione che assegnano in modo univoco ad ogni simbolo della grandezza originaria un simbolo o una sequenza di simboli della nuova grandezza. Per esempio il codice binario fa corrispondere ad ogni simbolo dei numeri decimali, univocamente, una sequenza di simboli binari. La maggior parte dei codici è invertibile cioè a sequenze di simboli della grandezza originaria corrispondono sequenze di simboli della nuova grandezza e viceversa. La trasformazione dalla grandezza originaria a quella nuova si chiama codifica (o codificazione), il procedimento inverso decodifica (o decodificazione). Quindi in pratica ogni sistema di numerazione può essere convertito in qualunque altro sistema di numerazione, esiste una corrispondenza biunivoca tra i sistemi numerici. Nella pratica informatica i codici oltre che essere invertibili devono essere: il più possibile compatti in modo che i tempi di trasmissione e la richiesta di memoria rimangano ridotti; il codice deve avere ampia tolleranza nei confronti di errori di codifica e di trasmissione; le grandezze devono essere rappresentate con lunghezza di parola costante, perché questa è un’esigenza della maggior parte dei calcolatori. Vediamo alcune regole di conversione tra sistemi di numerazione diversi. 7 Conversione binario-decimale. Partendo dalla forma polinomia otteniamo la conversione del numero espresso in binario nel corrispondente numero decimale. Consideriamo per esempio il numero intero 1101 2: 11012 = 1*23 + 1*22 + 0*21 + 1*20 = 8+4+0+1=13 10110112 = 1*26 + 0*25 + 1*24 + 1*23 + 0*22 + 1*21 + 1*20 = = 1*64 + 0*32 +1*16 + 1*8 + 0*4 + 1*2 + 1*2 + 1*1 = = 64 + 16 + 8 + 2 + 1 = 91 Quindi 10110112 = 9110. La regola pratica per abbreviare le operazioni necessarie è la seguente: 1) Si raddoppia il bit più significativa e si aggiunge il secondo bit. 2) Si raddoppia la somma e si aggiunge il terzo bit. 3) Si procede raddoppiando le somme e aggiungendo i bit successivi fino al bit meno significativo; l’ultima somma rappresenta il numero decimale. Vediamo un esempio di questa regola: 1 1 0 2 +1 2 +0 3 6 1 0 0 2 +1 2 +0 2 +0 13 26 52 1 2 +1 105 1 2 +1 211 Quindi 110100112 = 21110 Conversione decimale-binario. Consideriamo separatamente il caso della conversione della parte intera e della parte frazionaria di un numero in base 10. Per la conversione della parte intera ricordiamo che il valore decimale di un numero intero N espresso in forma binaria è: N = Cn-1 2n-1 + Cn-2 2n-2 + ........... + C121 + C020 dove i valori che le C possono assumere sono o 0 o 1. Dividendo ambo i membri di tale equazione per 2 ottengo un quoziente Q 1 e un resto C0: N/2 = Cn-12n-2 + Cn-22n-3 + .......... +C120 + C02-1 = Q1 + C02-1. 8 Il resto ottenuto C0 costituisce il bit meno significativo del numero binario corrispondente ad N. Dividendo successivamente il quoziente Q1per due otteniamo un quoziente Q2 e un resto C1 cioè: Q1/2 = Cn-12n-3 + Cn-2 2n-4 +...........+ C2 20 + C12-1 Il resto C1 rappresenta la successiva meno significativa. Procedendo nelle divisioni successive per 2 finché Qn diventa nullo otterremo come resti tutte le cifre binarie C n-1 Cn-2 ........ C1 C0 che costituiscono la rappresentazione binaria corrispondente al numero dato N. Il procedimento di conversione si basa allora sui passi del seguente riquadro: 1) Si divide il numero decimale per due fino ad ottenere il quoziente nullo ; 2) si considera la successione dei resti; il primo resto è la cifra meno significativa del numero binario, mentre l’ultimo resto costituisce la cifra più significativa. 9 Vediamo qualche esempio: a) conversione in binario di (37)10 : 37 2 18 2 0 9 2 1 4 2 0 2 2 0 1 2 1 0 quoziente nullo (37)10 = (100101)2 b) conversione in binario di (68)10 : 68 2 34 2 0 17 2 1 8 2 0 4 2 0 2 2 1 1 2 1 0 quoziente nullo (68)10 = (1000100)2. La conversione della parte frazionaria di un numero in base dieci si ottiene utilizzando il metodo delle moltiplicazioni successive. Detta N’ la parte frazionaria, la sua rappresentazione sarà: N’ = C-12-1 + C-2 2-2 +............+C-m2-m Moltiplicando per 2 ambo i membri della precedente uguaglianza otteniamo: 10 2N’ = C-120 + C-22-1 +...............+ C-m2-m+1 = C-1+F1 cioè una parte intera C-1 ed una frazionaria F1. La cifra C-1 ottenuta rappresenta la cifra meno significativa della rappresentazione binaria. Moltiplicando successivamente per 2 la parte frazionaria F 1 otteniamo: 2F1 = C-220 + C-32-1 + ..............+ C-m2-m+2 = C-2 + F2 La cifra C-2 ottenuta rappresenta la cifra meno significativa successiva. Il procedimento continua finché la parte frazionaria si annulla, oppure si raggiunge la precisione voluta di numero di cifre binarie dopo il punto radice. I passi del procedimento di conversione sono: 1) si moltiplica per due la parte frazionaria del numero in base dieci; 2) la parte intera del prodotto ottenuto è una cifra binaria della parte frazionaria del numero binario corrispondente al dato; 3) se la parte frazionaria non è nulla oppure non si è ancora raggiunto il desiderato numero di cifre dopo il punto radice, si considera la parte frazionaria del prodotto e torna al punto 1) altrimenti ............... ; 4) si scrivono le cifre binari di cui al punto 2 nell’ordine di determinazione. Vediamo alcuni esempi: a) convertire in binario il numero frazionario N’ = 0.5625: 0.5625* 2 = 1.1250 0.1250 * 2 = 0.2500 0.2500 * 2 = 0.5000 0.5000 * 2 = 1.0000 La parte intera del prodotto è 1001 dove 1 (+ a sinistra) è il bit più significativo e l’1 + a destra è quello meno significativo. I due zeri nel mezzo sono le cifre del numero frazionario binario. Il risultato è quindi: (0.5625)10 = (0.1001)2. b) convertire in binario con 5 bit frazionari il numero N’ = 0.3562 0.3562 * 2 = 0.7124 0.7124 * 2 = 1.4248 0.4248 * 2 = 0.8496 0.8496 * 2 = 1.6992 0.6992 * 2 = 1.3984 11 La parte intera del prodotto è 01011 ( quinta cifra dopo il punto binario). Il risultato della conversione è quindi: (0.3562)10 = (0.01011)2. Il vantaggio del sistema binario è quello di poter esprimere un numero facendo uso di due soli simboli grafici; ad esso si contrappone però lo svantaggio di stringhe la cui lunghezza è di gra lunga superiore a quella corrispondente all’espressione dello stesso numero nelle altre basi. Il numero di bit necessari per rappresentare un numero N è l’intero che soddisfa la relazione seguente: 2n-1= N = 2n . Il massimo numero rappresentabile con n bit è quindi 2 n-1; in particolare per n=2 esso è 22 - 1 = 3, per n=3 otteniamo 23 - 1 = 7, per n=4 risulta 24 - 1 = 15 e così via. Di qui deduciamo che per determinare il numero di bit necessari per esprimere in binario un numero N basta determinare il più piccolo numero intero n tale che 2n > N. Per esempio: a) Se N = 1198 otteniamo 211 = 2048 > 1198 per cui il numero di bit necessario è 11; b) Se N = 61 otteniamo 26 = 64 > 61 per cui il numero di bit. Addizione binaria. Le regole dell’addizione di due bit sono sintetizzate nella seguente tabella: + 0 1 0 0 1 1 1 0 con riporto di 1 in quanto (1)2 + (1)2 = (10)2 L’addizione di due numeri si esegue quindi tenendo conto dei riporti. Vediamo degli esempi: 12 a) dati A = 10111 B = 101 otteniamo 111 riporti 10111 + 101 = 11100 1+1 = 10, scrivo 0 e riporto 1 1+1 = 10, 0 e riporto 1 1+1 = 10, 10 + 1= scrivo 1 e riporto 1 1+0 = 1 1 L’addizione di due numeri binaria può essere verificata utilizzando il seguente metodo: A = 1*24 + 0*23 + 1*22 + 1*21 +1*20 = 16 + 4 + 2 + 1 = 23 B = 1*22 + 0*21 + 1*20 = 4+1 = 5 A + B = 1*24 + 1*23 + 1*22 + 0*21 + 0*20 = 16+8+4 = 28 b) calcolare A+B essendo A = 1011011 e B = 1011010 otteniamo: 1 1 1 1 riporti A 1011011 + B 1011010 = A + B 10110101 bit di riporto L’esempio mostra che la somma di due numeri binari di n bit può avere n+1 bit. Sottrazione binaria. Le regole della sottrazione tra due numeri binari possono essere espresse dalla tabella seguente: 0 1 minuendo 0 0 0 1 0 1 sottraendo con prestito di 1 in quando (10)2-(1)2 = (1)2 13 La sottrazione di due numeri binari si ottiene con il metodo diretto (cioè secondo le normali regole) si ottiene come nel sistema decimale tenendo conto degli eventuali prestiti. Quando il sottraendo è maggiore del corrispondente minuendo dobbiamo prendere in prestito una unità dalla cifra vicina alla sinistra in modo che la nuova cifra quella corrispondente del sottraendo; l’unità presa in prestito dobbiamo poi restituirla aggiungendola alla successiva cifra del sottraendo. Per verificare l’esattezza dell’operazione eseguita possiamo determinare la somma della differenza con il sottraendo e confrontarla con il minuendo, oppure si può convertire gli operandi e il risultato nel numero decimale. Vediamo un esempio: differenza 01101111+ sottraendo In base dieci: minuendo 10010000 0100001= differenza 111+ sottraendo 33= minuendo 144 Moltiplicazione binaria. Le regole della moltiplicazione di due bit sono riportate nella seguente tabella: 0 1 moltiplicatore 0 0 0 1 moltiplicando Il procedimento della moltiplicazione binaria è simile a quello della moltiplicazione decimale; ogni cifra del moltiplicatore genera un prodotto parziale in base al suo valore e cioè: se è 1 il prodotto parziale è uguale al moltiplicatore e si scorre di un posto a sinistra se è 0 il prodotto parziale è uguale a zero e si scorre di un posto a sinistra I prodotti parziali vengono poi sommati. La procedura di moltiplicazione in binario è la seguente: 14 1) Se la cifra del moltiplicatore è 1, copiare esattamente il moltiplicando e spostarsi di una posizione a sinistra. 2) Se la cifra del moltiplicatore è 0, copiare tutti zeri e spostarsi a sinistra di una posizione. 3) Addizionare i prodotti parziali. Vediamo un esempio: 1011* 101= 1011 0000 1011 110111 Divisione binaria. La divisione binaria si esegue con lo stesso procedimento che si usa nel caso dei numeri su base decimale. I passi che devono essere seguiti sono i seguenti: 1) Si confrontano gli n bit più significativi del dividendo con gli n bit del divisore. 2) La prima cifra del quoziente sarà 1 oppure 0 a seconda che il divisore contenga o no il dividendo. 3) Si applicano successivamente le regole della divisione decimale. Vediamo qualche esempio: 1001 11 11 011 11* prova 11= 11 11 11 11- 0 1001 Secondo esempio: 111011 101 101 1011 1011* prova 101= 1001 1011 101 0000- resto 100 1011110111+ 100= resto 111011 15 Complemento, sottrazione in complemento a due. La sottrazione tra due numeri binari può essere effettuata anche con due tecniche diverse da quelle viste in precedenza. Vediamo il procedimento nel caso di due numeri decimali. 5376 - 3717 = 1659. Questa operazione può essere eseguita anche nel modo seguente: 5376 + (10000 - 3717) - 10000 = 5376 + 6283 - 10000 = 1659 complemento a 10 del sottraendo L’algoritmo di calcolo con l’utilizzo del complemento a 10 nel sistema decimale si svolge seguendo i seguenti passi: 1) Dati il minuendo e il sottraendo si pareggiano eventualmente le cifre del sottraendo con degli zeri (“0”) a sinistra più significativa. 2) Si calcola il complemento a dieci del sottraendo. 3) Si addiziona il minuendo al complemento a dieci del sottraendo. 4) Si trascura la cifra più significativa della somma ottenuta; il numero rimanente è la differenza cercata. Vediamo un altro esempio: 7893 - 231 = 7893 - 0231 = 7893 - (10000-0231) = 7893 + 9769 = 17662 il numero 1 all’inizio dell’ultimo risultato lo trascuro, 7662 è il valore della differenza. In generale se Cn-1 Cn-2 ............. C1 C0 è la rappresentazione in base B di un numero intero N di n cifre chiamiamo complemento alla base di N il numero Bn -N che può essere calcolato facendo il complemento a B-1 delle singole cifre che lo compongono e addizionando poi 1. Bisogna calcolare il complemento del sottraendo solo dopo aver pareggiato le sue cifre con quelle del minuendo (il numero delle cifre deve coincidere). Questo metodo può essere applicato anche nel caso della sottrazione tra due numeri binari, ma in questo caso si utilizzerà il complemento a due. Nel caso dei numeri binari possiamo utilizzare due tipi di algoritmi per determinare tale complemento a due. 1° algoritmo : innanzitutto occorre determinare il complemento a 1 di una cifra binaria che è dato dalla cifra inversa ad ogni bit del numero (trasformando gli 0 in 1 e viceversa) e poi si aggiunge 1. Vediamo un esempio: 1011011 0100100 + complemento ad uno 16 1 = aggiungo 1 0100101 Sommando il complemento a 1 del numero dato addizionato ad 1con il numero stesso otteniamo: 1011011+ 0100101= 10000000 questo è il complemento a 2 di livello superiore 2°algoritmo : Si copiano i bit del numero da quello meno significativo finché si incontra 1, dopo aver copiato questo primo 1 si invertono i successivi bit. Vediamo un esempio: 100110 li copio (dal bit meno significativo fino al 1°)1 devo invertirli 011010 La sottrazione tra due numeri binari con il metodo del complemento a due deve essere effettuato seguendo i seguenti passi: 1) Si pareggiano le cifre di minuendo e sottraendo inserendo degli zeri a sinistra della cifra più significativa. 2) Si calcola il complemento a due del sottraendo. 3) Si addiziona il minuendo al complemento a due del sottraendo. 4) Si trascura il bit più significativo del risultato ottenendo in tal modo la differenza voluta. Vediamo un altro esempio: 101101111101= 1011011 0011101= 1011011+ 1100011= 10111110 Il primo “1” del risultato deve essere trascurato, “0111110” è la differenza. TABELLA DI CORRISPONDENZA TRA SISTEMI DI NUMERAZIONE DECIMALE BINARIO OTTALE ESADECIMALE 0 0000 00 0 1 0001 01 1 17 2 0010 02 2 3 0011 03 3 4 0100 04 4 5 0101 05 5 6 0110 06 6 7 0111 07 7 8 1000 10 8 9 1001 11 9 10 1010 12 A 11 1011 13 B 12 1100 14 C 13 1101 15 D 14 1110 16 E 15 1111 17 F 18 CODIFICAZIONE DELLE INFORMAZIONI Per poter elaborare automaticamente le informazioni è necessario procedere alla codificazione delle stesse, occorre cioè tradurre le parole realizzate come sequenza di simboli dell’alfabeto esterno in parole costituite da simboli dell’alfabeto interno. UTENTE Parole dell’alfabeto esterno Parole dell’alfabeto interno CODIFICATORE Alfabeto interno Alfabeto esterno CODIFICATORE Per alfabeto esterno ci si riferisce: 1) 26 lettere maiuscole dell’alfabeto inglese (A, B,.........X , Y, Z) 2) 10 cifre decimali 3) 28 caratteri speciali (segni di interpunzione, simboli matematici, lo spazio detto anche blank o space). Lo spazio non corrisponde ad un carattere di stampa effettivo ma viene utilizzato come elemento separatore tra parole e/o numeri. L’elaboratore è quindi in grado di interagire con l’ambiente esterno ma le informazioni devono essere tradotte nell’alfabeto interno che è quello binario. L’operazione di traduzione nota come codificazione mette in corrispondenza biunivoca le parole corrispondenti costruite sui due alfabeti e permette il passaggio tra l’interno e l’esterno dell’elaboratore. In generale dati due alfabeti A e B l’esistenza dal seguente teorema: A = a1 a2 ......... an B = b1 b2 ..........bm con n ed m maggiori di 1, è possibile codificare l’insieme delle possibili parole realizzate su A (che indichiamo con A*) mediante parole dell’insieme B*. La dimostrazione si basa sul fatto che è possibile interpretare gli elementi di A come simboli di un sistema di numerazione posizionale di base n per cui ogni parola appartenente ad A* può essere 19 considerata come la rappresentazione di un numero intero N in tale sistema; il numero N può essere rappresentato mediante il sistema posizionale in base m con simboli appartenenti a B e quindi mediante parole di B*. Nel caso degli elaboratori l’alfabeto interno è quello binario. Ogni elaboratore ha un proprio sistema di codifica detto codice macchina; il problema della codifica è comunque un problema interno all’elaboratore; la rappresentazione binaria all’interno della macchina non incide sui principi di funzionamento della stessa. CODIFICAZIONE DEI NUMERI I numeri possono essere codificati in binario; questa codificazione richiede diversi sistemi di codifica. Una di queste tecniche fa uso della conversione in binario non dell’interno numero ma di cifra per cifra servendosi di un codice opportuno. Vediamo alcuni sistemi di codificazione numerica: 1) BCD (Binary Coded Decimal) in cui la rappresentazione di ogni cifra decimale si ottiene con 4 bit dell’alfabeto binario. Vediamo degli esempi: 1710 = 0001 0111 1 8110 = 1000 8 7 0001 1 20 La tabella di corrispondenza delle dieci cifre decimali è la seguente: cifra decimale codice BCD 0 0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110 7 0111 8 1000 9 1001 Poiché con 4 bit siamo in grado di rappresentare solo 2 4= 16 simboli il codice BCD non è ottimale. Si dice che un codice è ottimale quando la quantità dei caratteri da codificare coincide con l'utilizzo dei bit. Osservazione. L’insieme dei bit utilizzati per rappresentare un carattere è detto byte. Il byte è la minima unità di rappresentazione dell’informazione ed il numero di bit che lo costituisce può variare a seconda del codice; generalmente il byte è costituito da otto bit perché sono stati sviluppati codici per caratteri alfanumerici con cui è possibile rappresentare 28 = 256 caratteri. Un insieme di byte costituisce una parola o word; la lunghezza della parola cioè il numero di bit che lo compongono varia a seconda del tipo di elaboratore. Abbiamo parlato di caratteri alfanumerici, vediamo di che si tratta. L’insieme dei caratteri alfanumerici è costituito da 26 = 64 caratteri che possono essere codificati pertanto su sei bit. Nei calcolatori moderni l’insieme dei bit usato per formare un carattere è di 8 bit per cui è possibile codificare 28 =256 caratteri potendo in tal modo aggiungere ai 64 già menzionati le lettere minuscole ed altri segni particolari. I sistemi di codificazione più comunemente usati per rappresentare all’interno degli elaboratori i caratteri alfanumerici con 8 bit sono l’EBCDIC (Extended Binary Code Decimal Interchange Code) che è la 21 codifica degli elaboratori IBM e l’ASCII (American Standard Code for Information Interchange) usati negli elaboratori della DEC. 1) EBCDIC. In base alla codifica EBCDIC ogni carattere occupa un byte, 8 bit, quindi il codice permette di codificare 256 caratteri (28) 0 1 2 3 4 5 6 7 Questo è un byte. La metà di un byte è detta semibyte; il semibyte di sinistra (da 0 a 3) è detto zonatura (zone) mentre quello di destra comprende i bit da 4 a 7 è detto digit. Zonatura Digit Semibyte (03); Semibyte (47) 2) ASCII. Nel codice ASCII i semibyte hanno il nume invertito, il primo si chiama digit (da 0 a 3) il secondo è la zonatura quindi la sequenza dei bit per memorizzare i dati è invertita 7 6 5 zonatura 4 3 | 2 1 0 digit 22 Osservando la tabella possiamo osservare una serie di CODICI: SPACE: spazio SYN: sincronizzazione SOH: STX: caratteri speciali non stampabili che servono per la trasmissione ETX: dei dati EOT: ALK: NAK: ETB: CAN: ESC: Nella zona 7 possiamo vedere che metà dei codici sono 0 e l’altra metà sono 1. Il numero meno significativo è lo 0. PARAWIN: è un esempio di pacchetto di programmi per riempire le seconda parte della tabelle ASCII che normalmente è vuota, per esempio con caratteri celtici. Il codice KOI-8 è basato sui codici ASCII relativamente alla prima parte della tabella dei codici, mentre la seconda parte viene riempita con dei codici non standard che possono essere di lingue diverse permettendo di trasmettere i messaggi in modo completo. Cambia così il layout della tastiera per ricomprendere dei codici che non sono compresi nel codice ASCII. Basandosi sui medesimi principi di codificazione sono stati sviluppati vari codici alcuni dei quali servono per esprimere i colori. Per esempio nel caso di 216 colori si ha che : il NERO viene rappresentato con 000000 il BIANCO con FFFFFF il GOSTWHITE con F8F8FF Sezionando il codice si comprende che questo è formato di tre parti che rappresentano l’intensità dei tre punti fondamentali dello schermo, rosso, blu e verde. I codici EBCDIC e ASCII si riferiscono a informazioni di tipo alfabetico e non numerico nel senso che la serie di cifre non è considerata come un numero sul quale agire con 23 operazioni aritmetiche ma come una generica informazione espressa come un numero. Per esempio: codice di avviamento postale o un numero telefonico. I codici servono solo per trasferire le informazioni. RAPPRESENTAZIONE DI INFORMAZIONI NUMERICHE Ogni numero può essere codificato in binario ma in questo modo la struttura decimale del numero è completamente alterata. Quando si vogliono ottenere i vantaggi tecnici offerti dal sistema in base due senza perdere la struttura decimale del numero, ossia osservando l’individualità delle singole cifre, oppure nei casi di trasmissione si può usare per la codifica il codice BCD visto precedentemente. Nel caso in cui le informazioni numeriche debbano essere elaborate si possono operare differenti rappresentazioni che nel caso del sistema IBM 370, per esempio, sono: 1) decimale zoned 2) decimale packed 3) binario fixed point (virgola fissa) 4) binario floatting point (virgola mobile). Ogni elaboratore utilizza un proprio sistema di rappresentare i numeri di base che dipende: dal tipo di architettura del processore, cioè la lunghezza del bus dei dati il sistema operativo utilizzato. Ci sono delle applicazioni di CAD che operano direttamente con l’hardware, scavalcano il sistema operativo. Di solito invece la situazione è la seguente: SA (software applicativo) SO (sistema operativo) HARDWARE 24 Il software applicativo non interagisce direttamente con l’hardware ma attraverso il sistema operativo. Anche il software applicativo influenza la rappresentazione dei numeri. Analizzeremo tre tipi di rappresentazione dei numeri: 1) rappresentazione dei numeri interi (integer) 2) rappresentazione dei numeri in virgola fissa (fixed point) 3) rappresentazione dei numeri in virgola mobile (floating point numbers) In alcuni sistemi la rappresentazione dei numeri interi e a virgola fissa si considera uguale. 1) Rappresentazione dei numeri interi. Un calcolatore trasforma i numeri interi immessi in numeri del sistema di numerazione usato internamente e successivamente in simboli binari. Per motivi tecnici i calcolatori utilizzano di solito un numero fisso di bit per la rappresentazione dei numeri interi, che si chiama lunghezza di parola fissa. Se un numero non occupa cvompletamente la lunghezza di parola prevista, la sequenza dei numeri binari viene riempita verso sinistra con gli zeri. Per esempio consideriamo di avere una lunghezza fissa di parola di 16 bit: 199310 = 111110010012 viene trasformata in: 0000 0111 1100 1001 2 dove i primi 4 zeri sono di riempimento e servono per rappresentare il numero con 16 bit, che è la lunghezza fissa. Il segno di un numero viene codificato dal primo bit del numero stesso, purtroppo può avvenire in vari modi. La diversità comincia già dall’assegnazione del primo bit. Per esempio nel caso dell’IBM se il primo bit è 0 il segno è negativo, se invece il primo bit è 1 allora il segno è positivo. 2) Rappresentazione dei numeri in virgola fissa. La virgola è in sostanza un separatore. I numeri vengono messi in colonna tenendo conto della virgola. Ogni numero a virgola fissa n occupa un campo di lunghezza fissa che può essere una mezza voce (half word) oppure una voce. Il primo bit è riservato al segno S con la convenzione vista prima (0=segno negativo 1=segno positivo). Vediamo uno schema della rappresentazione fixed point usato dalle case costruttrici IBM e DEC: 25 S 0 i half word IBM 370 1......................................15 n° bit S i half word PDP 11 15 14.......................................0 S i full word IBM 370 0 1.................................................................….......…...31 Nella parte i costituita da n-1 bit viene rappresentato in binario il valore assoluto del numero; nella maggior parte degli elaboratori i numeri negativi sono rappresentati in complemento a due del corrispondente numero positivo. I massimi e i minimi numeri rappresentabili sono: per n-1 = 15 max = 215 -1 = 32767 min = -215 = -32767 per n-1 = 31 max = 231-1 = 2147483647 min = -231 = -2147483647 I risultati di operazioni aritmetiche su numeri fixed point sono ancora numeri fixed point. Si può presentare il caso in cui il risultato preveda un numero di bit maggiore di quello disponibile il che è dovuto alla lunghezza fissa della parola. Questa situazione si chiama OVERFLOW (traboccamento). Quindi diciamo che si ha l’OVERFLOW (traboccamento): quando il risultato ottenuto attraverso operazioni aritmetiche con numeri fixed point richiedono un numero di bit maggiore di quello previsto dalla lunghezza della parola che è fissa. Vediamo un esempio: lunghezza della parola 9|8 + 0|6 1 Overflow risultato che non entra nella lunghezza della parola 0|4 26 3) Rappresentazione in virgola mobile. Si tratta di numeri reali per i quali al fine di non dover controllare la posizione del punto decimale e di non doversi preoccupare del numero delle cifre del risultato ottenuto attraverso operazioni aritmetiche, si usa una rappresentazione i virgola mobile (floating point) che è la rappresentazione normalizzata di uso più frequente negli elaboratori. Rappresentazione normalizzata. I numeri reali sono costituiti da due parti: 1) la MANTISSA: che sono le cifre significative del numero 2) la CARATTERISTICHE: che è l’esponente di una base prestabilita che fornisce l’ordine di grandezza. Vediamo un esempio: il numero 732,8 può essere rappresentato nei seguenti numeri modi: MANTISSA CARATTERISTICA 732,8 100 73.28 101 7328 10-1 7,328 102 0,7328 103 In generale un dato numerico qualsiasi ammette una rappresentazione del tipo <caratteristica> <mantissa> * <base del sistema di numerazione> dove: <mantissa> = x1 x2 .........xh*y1y2..............yk; <caratteristica> = a1a2 ............... ap essendo xi yi ai cifre del sistema di numerazione considerato. Se un numero è rappresentato come: <caratteristica> *<mantissa>*<base del sistema di numerazione> si dice che è rappresentato secondo la notazione esponenziale normalizzata; la mantissa rappresenta pertanto un numero inferiore ad 1. 27 La rappresentazione floating point viene fatta con campi di lunghezza fissa di una voce o doppia voce e si può schematizzare come nella figura seguente: S CARATTERISTICA MANTISSA 0 1 2 .........................7 8..........................31 Vediamo quali sono le trasformazioni a cui è sottoposto un numero per la rappresentazione in binario floating point (le trasformazioni sono svolte dall’elaboratore). esponente Z = m *Bn Base del sistema di calcolo Numero in virgola mobile MANTISSA Spesso l’esponente di un numero in virgola mobile si chiama anche la caratteristica. La mantissa e l’esponente possono avere lo stesso segno (+;-) Il numero normalizzato in virgola mobile inizia di solito con lo 0 nella parte intera. Esempio: 123,5*108 = in forma normalizzata 0,1235 S MANTISSA 8 bit ESPONENTE 8 bit SEGNO In generale si dice che sono numeri in virgola mobile quelli per cui spostando la virgola occorre modificare l’esponente per mantenere inalterato il suo valore. Per esempio: 1,23*10-3 = 0,123*10-2 = 12,3*10-4 Range è l’intervallo dei numeri che possiamo rappresentare in virgola fissa o in virgola mobile con una parola. 28 La precisione della rappresentazione dei numeri reali: la lunghezza della mantissa nei numeri in virgola mobile e il numero di cifre in virgola fissa determinano la precisione del numero reale rappresentato. Per ottenere una precisione maggiore i calcolatori lavorano con una lunghezza di mantissa maggiore. Per rappresentare i numeri il numero delle cifre significative viene spesso aumentato notevolmente utilizzando una precisione doppia cioè due parole una di seguito all’altra (doppia parola significa doppia precisione). La precisione riguarda la lunghezza della mantissa. Rappresentazione dei numeri negativi. Per la rappresentazione dei numeri negativi le tecniche generalmente usate sono: 1) modulo e segno sottrazione zeri 2) complemento a 2 addizione uno zero solo 3) complemento a 1 addizione zeri 1) Modulo e segno. Per rappresentare un numero con questa tecnica occorre considerare il segno (0 per positivo, 1 per negativo) il suo valore assoluto o modulo. Nella rappresentazione di numeri fixed point il segno occupa il bit più a sinistra del campo ed il modulo i restanti bit. Il range dei numeri che possono essere rappresentati è allora -2n-1 -1,..........,o,.......... 2n-1 -1 cioè per n-1 =15 da -32767 a +32767 e per n-1 = 31 da -2147483647 a +2147483647 In questa rappresentazione esistono due zeri uno positivo e uno negativo. Questa rappresentazione presuppone nell’elaboratore ci siano dispositivi che trattano il bit del segno in modo diverso da quelli che rappresentano il modulo; l’analisi del segno dei due operandi definisce se occorre eseguire l’addizione oppure le sottrazione e quindi se il dispositivo addizionatore-sottrattore deve essere usato in un modo o nell’altro. Poiché dati due numeri relativi a e b vale la relazione a-b = a+(-b) e a+b = a-(-b) possiamo fare a meno del sottrattore o dell’addizionatore considerando il complemento a due del sottraendo. 2) Complemento a due. Questa tecnica elimina la presenza di uno zero positivo e di uno negativo e permette l’esecuzione delle operazioni aritmetiche in modo molto semplice. 29 Per ottenere il complemento a due di un numero negativo codificato su n bit si procede nel seguente modo: 1) si rappresenta il corrispondente numero positivo espandendo verso destra il segno; 2) si determina il complemento a due Vediamo un esempio: rappresentare in complemento a due il numero -72 +72 = 0 000 0000 0100 10002 espansione verso destra 1 111 1111 1011 1000 complemento a due di -72 segno 0100 10002 = 72 gli zeri in più sono necessari per riempire i 16 bit. L’addizione di numeri in complemento a due non tiene conto del segno degli operandi ed è realizzata addizzionandoli e non tenendo conto dell’eventuale riporto. Vediamo un esempio: -33+ 11011111+ +21= 00010101= -12 11110100 -12 in complemento a due Vediamo un altro esempio: -33+ 11011111+ -21= 11101011= -54 111001010 -54 in complemento a due 30 La sottrazione di numeri in complemento a due è realizzata invertendo il segno del sottraendo e addizionando il minuendo. L’inversione del segno può essere realizzata prendendo il complemento a due del sottraendo; dato quindi a-b consideriamo -b e lo addizioniamo ad a : a+ (-b). Vediamo un esempio: +33 - (-21) = (00100001) - (11101011) = = (00100001) + (00010101) = = 00110110 54 Vediamo un altro esempio: +33 - (+21) = (00100001) - (00010101) = = (00100001) + (11101011)= = 00001100 12 Osseviamo che i numeri negativi si ottengono complementando a due i corrispondenti positivi che a loro volta si otterranno complementando a due i numeri negativi corrispondenti. 3) Complemento a uno.Il metodo del complemento a uno fu realizzato al fine di addizionare due numeri con segno diverso allo stesso modo di due numeri con lo stesso segno. Per realizzare il complemento a 1 di un numero negativo basta considerare il corrispondente numero positivo e invertire i bit. Vediamo un esempio: determiniamo il complemento a uno di -33: +3310 = 001000012 110111102 inversione Notiamo che il complemento a uno del complemento a uno di un numero è il numero stesso; come per il complemento a due si inverte il segno senza tenere conto del segno originale del numero. In questa rappresentazione esiste uno zero negativo e uno positivo. L’addizione di numeri in complemento ad uno può essere eseguita non considerando i segni degli operandi; le procedure sono le seguenti: 1) si addizionano i due numeri nella rappresentazione in complemento a 1; 31 2) se si verifica un riporto questo è addizionato al bit meno significativo della somma. Vediamo un esempio: +33+ 00100001+ -21= 11101010= +12 100001011+ 1= addizione del riporto riporto 00001100 +12 Vediamo un altro esempio: -33+ 11011110+ -21= 11101010= -54 111001000+ 1= addizione del riporto riporto 11001001 -54 in complemento a uno 32