Rappresentazione informazione ed elementi di aritmetica dei computer Salvatore Orlando 1 Rappresentazione dell informazione Simbolo (es. cifra o lettera) - Significato (es. numero o suono) Per comunicare/rappresentare informazioni è necessario usare dei simboli Necessaria una convenzione (rappresentazione, codifica o codice) per associare i simboli con il loro significato Necessario un alfabeto insieme di simboli adottati per rappresentare informazione Es: per rappresentare numeri nei calcolatori elettronici Alfabeto binario: {0, 1} Simboli associati con stati elettrici facilmente distinguibili (es.: conducibilità o meno di un transistor) 2
Codifica o codice Dati: un Alfabeto A (ad esempio, alfabeto binario: A={0,1}) s dati distinti D={d 0, d 1,, d s-1 } una codifica (o codice) fornisce una corrispondenza tra sequenze (configurazioni) di simboli in A, ed i vari dati d i D Solitamente, i codici fanno riferimento a sequenze di simboli di lunghezza fissa K Configurazioni possibili su K posizioni di un alfabeto di N simboli: N K Rispetto ad un alfabeto binario numero totale di configurazioni: 2 k >= s (dove s è la cardinalità dell insieme D) Es.: se D comprende le 26 lettere dell alfabeto inglese (s=26), allora K >= 5, poiché 2 4 = 16 < 26 < 32 = 2 5 2 K 3 Codifica dei numeri Codifica informazioni non numeriche può essere effettuata in maniera arbitraria. Basta fissare una convenzione per permettere di riconoscere i dati Es. Codice ASCII - American Standard Code for Information Exchange - è una codifica di caratteri alfanumerici su sequenze di simboli binari di lunghezza k=8 Es. Colori delle componenti RGB dei pixel dello schermo Codifiche dei numeri accurata, perché è necessario elaborare (sommare, moltiplicare ecc.) le rappresentazioni dei numeri Di solito si adotta il sistema di numerazione arabica, o posizionale 4
Sistema di codifica posizionale Nel sistema di numerazione arabica in base B=10, ogni cifra (simbolo), appartenente all alfabeto di 10 simboli A={0,1,,9}, ha un valore diverso in base alla sua posizione nella stringa di simboli in A E necessario prima fissare una corrispondenza tra questi simboli di A e il loro significato astratto, ovvero i primi B numeri naturali: {0,1,2,,B-1} I numeri maggiori di B sono rappresentabili come sequenze (stringhe) di n simboli d i A : d n-1 d 1 d 0 Valore numerico corrispondente, dove la significatività delle cifre è espressa sulla base di una potenza di B=10: 10 n-1 * d n-1 + + 10 1 * d 1 + 10 0 * d 0 E possibile adottare altre basi, dove B>1, e scegliere di conseguenza un alfabeto composto da B simboli 5 Numeri naturali in base 2 Alfabero binario A={0,1}, dove i simboli sono detti bit, con 0 corrispondente al numero zero ed 1 al numero uno Numeri rappresentati su un numero di posizione finite Con stringhe di n bit, sono rappresentabili 2 n dati (numeri diversi) dal numero 0 al numero 2 n -1 Sequenza di n bit d i {0,1} : d n-1 d 1 d 0 Valore numerico corrispondente, dove la significatività delle cifre è espressa sulla base di una potenza di B=2: 2 n-1 * d n-1 + + 2 1 * d 1 + 2 0 * d 0 Esercizio: Trovare il valore numerico della stringa di simboli 432 in base 5 A = {0,1,2,3,4} 432 5 = 25*4 + 5*3 + 2 =100+ 15 + 2 = 117 10 6
Conversione inversa Da base 10 a base B Procedimento per divisione Dato un certo numero N rappresentabile in base B come d n-1 d 1 d 0, e la cui significatività è: B n-1 * d n-1 + + B 1 * d 1 + B 0 * d 0 Se dividiamo per B: Quoziente: B n-2 * d n-1 + + B 0 * d 1 Resto: d 0, 0<= d 0 <B Iteriamo il procedimento fino ad ottenere un Quoziente = 0 Q=N; i=0; while(q>0) { d[i] = Q % B; // Q mod B Q = Q / B; i++: } // Q div B Q R 4 0 2 0 1 1 0 4 10 = 100 2 7 Rappresentazioni ottale ed esadecimale Ottale: base = 8 Esadecimale: base = 16 Usate per facilitare la comunicazione di numeri binari tra umani, o tra il computer e il programmatore Esiste un medodo veloce per convertire tra base 8 (o base 16) e base 2, e viceversa 8
Rappresentazione ottale B = 8, A = {0,1,2,3,4,5,6,7} Esiste un modo veloce per convertire tra base 8 e base 2, e viceversa 9 Dato un numero binario di 10 cifre: d 9 d 1 d 0, il cui valore è: 2 i d i i= 0 Raggruppiamo le cifre, da destra, a 3 a 3, e poniamo in evidenza la più grande potenza di 2 possibile: 2 9 d 9 + ( 2 3 d 8 +2 1 d 7 +2 0 d 6 ) 2 6 + ( 2 2 d 5 +2 1 d 4 +2 0 d 3 ) 2 3 + (2 2 d 2 +2 1 d 1 +2 0 d 0 ) Ciascun termine di 3 elementi è un numero compreso tra 0 e 7, e si possono far corrispondere ai simboli dell alfabeto ottale I fattori messi in evidenza corrispondono alle potenze di B=8: 1=8 0 2 3 =8 1 2 6 =8 2 2 9 =8 3 Da binario ad ottale: 1001010111 2 = 1 001 010 111 = 1127 8 Da ottale a binario: 267 8 = 010 110 111 = 10110111 2 9 Rappresentazione esadecimale B = 16, A = {0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f} Esiste un modo veloce per convertire tra base 16 e base 2, e viceversa 9 Dato un numero binario di 10 cifre: d 9 d 1 d 0, il cui valore è: 2 i d i i= 0 Raggruppiamo le cifre, da destra, a 4 a 4, e poniamo in evidenza la più grande potenza di 2 possibile: (2 1 d 9 + 2 0 d 8 ) 2 8 + (2 3 d 7 +2 2 d 6 + 21 d 5 +2 0 d 4 ) 2 4 + (2 3 d 3 +2 2 d 2 +2 1 d 1 +2 0 d 0 ) Ciascun termine di 4 elementi è un numero compreso tra 0 e 15, e si possono far corrispondere ai simboli dell alfabeto esadecimale I fattori messi in evidenza corrispondono alle potenze di B=16: 1=16 0 2 4 =16 1 2 8 =16 2 Da binario ad esadecimale: 1001011111 2 = 10 0101 1111 = 25f 16 Da ottale a binario: a67 16 = 1010 0110 0111 = 101001100111 2 10
Numeri binari magici 2 3 = 8 (8 bit = 1 Byte B) 2 5 = 32 (32 bit = 1 Word. La dimensione della word dipende dal processore. Esistono processori dove la Word è 2 6 = 64 bit) 2 10 = 1024 (K Kilo Migliaia - KB (kilobytes) - Kb (kilobits)) 2 20 (M Mega Milioni - MB o Mb) 2 30 (G Giga Miliardi - GB o Gb) 2 40 (T Tera Migliaia di Miliardi - TB o Tb) 2 40 (P Peta Milioni di Miliardi - PB o Pb) 11 Addizione di numeri naturali Le word del MIPS sono lunghe 32 bit I numeri unsigned rappresentabili su 32 bit sono allora: 0000 0000 0000 0000 0000 0000 0000 0000 two = 0 ten 0000 0000 0000 0000 0000 0000 0000 0001 two = 1 ten 0000 0000 0000 0000 0000 0000 0000 0010 two = 2 ten... 1111 1111 1111 1111 1111 1111 1111 1101 two = 4,294,967,293 ten 1111 1111 1111 1111 1111 1111 1111 1110 two = 4,294,967,294 ten 1111 1111 1111 1111 1111 1111 1111 1111 two = 4,294,967,295 ten Per la somma di numeri binari possiamo adottare la stessa procedura usata per sommare numeri decimali, sommando via via i numeri dello stesso peso più l eventuale riporto: la tabella per sommare 3 cifre binarie è la seguente: d0 d1 rip RIS RIP 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 1 0 1 1 0 0 1 0 1 0 1 0 1 1 1 0 0 1 1 1 1 1 1 12
Esempio di somma Sia A = 13 = 01101 e B = 11 = 01011 riporti: 1111 A: 01101 + B: 01011 = ---------- 11000 24 L algoritmo impiegato dal calcolatore per effettuare la somma è molto simile a quella carta e penna, dove le cifre sono prodotte una dopo l altra, da quelle meno significative a quelle più significative 13 Sottrazione e numeri relativi Per la sottrazione non viene impiegato l algoritmo che usa la ben nota nozione di prestito non si impiega l ovvia rappresentazione di modulo e segno per rappresentare i numeri relativi si usa una particolare rappresentazione dei numeri negativi si usa lo stesso circuito (ovvero lo stesso algoritmo) usato per la somma di numeri naturali anche per la somma di numeri relativi 14
Possibili rappresentazioni Modulo e Segno One's Complement Two's Complement 000 = +0 000 = +0 000 = +0 001 = +1 001 = +1 001 = +1 010 = +2 010 = +2 010 = +2 011 = +3 011 = +3 011 = +3 100 = -0 100 = -3 100 = -4 101 = -1 101 = -2 101 = -3 110 = -2 110 = -1 110 = -2 111 = -3 111 = -0 111 = -1 Problemi: bilanciamento: nel Complemento a Due, nessun numero positivo corrisponde al più piccolo valore negativo numero di zeri: le rappresentazioni in Modulo e Segno, e quella in Complemento a Uno, hanno 2 rappresentazioni per lo zero semplicità delle operazioni: per il Modulo e Segno bisogna guardare i segni e confrontare i moduli, per decidere sia il segno dell operazione, e sia per decidere se sommare o sottrarre Qual è la migliore rappresentazione e perché? 15 Complemento a 2 La rappresentazione in complemento a 2 è quella adottata dai calcolatori Il bit più significativo corrisponde al segno (0 positivo, 1 negativo) MIPS: Numeri naturali (con segno) di 32 bit: 0000 0000 0000 0000 0000 0000 0000 0000 two = 0 ten 0000 0000 0000 0000 0000 0000 0000 0001 two = + 1 ten 0000 0000 0000 0000 0000 0000 0000 0010 two = + 2 ten... 0111 1111 1111 1111 1111 1111 1111 1110 two = + 2,147,483,646 ten 0111 1111 1111 1111 1111 1111 1111 1111 two = + 2,147,483,647 ten 1000 0000 0000 0000 0000 0000 0000 0000 two = 2,147,483,648 ten 1000 0000 0000 0000 0000 0000 0000 0001 two = 2,147,483,647 ten 1000 0000 0000 0000 0000 0000 0000 0010 two = 2,147,483,646 ten... 1111 1111 1111 1111 1111 1111 1111 1101 two = 3 ten 1111 1111 1111 1111 1111 1111 1111 1110 two = 2 ten 1111 1111 1111 1111 1111 1111 1111 1111 two = 1 ten maxint minint 16
Complemento a 2 Rappresentazione di numeri in complemento a 2 su n bit 0: 0.0 2 n-1-1 numeri positivi: da 1 (0 01) a 2 n-1-1 (01..1) 2 n-1 numeri negativi, rappresentati dai numeri unsigned 2 n - N -1: 2 n -1 (1......1) -2 n-1 : 2 n -2 n-1 = 2 n-1 (10... 0) Il valore corrispondente alla rappresentazione dei numeri positivi è quella solita Per quanto riguarda i numeri negativi, per ottenerne direttamente il valore, basta considerare il bit di segno (=1) con peso: -2 n-1 Infatti, poiché - N viene rappresentato in complemento a 2 su n bit dal numero unsigned 2 n - N, se supponiamo che 2 n - N corrisponda alla n-upla 1 d n-2 d 1 d 0 2 n - N = 2 n-1 + 2 n-2 * d n-2 + + 2 1 * d 1 + 2 0 * d 0 - N = -2 n + 2 n-1 + 2 n-2 * d n-2 + + 2 1 * d 1 + 2 0 * d 0 - N = -2 n-1 + 2 n-2 * d n-2 + + 2 1 * d 1 + 2 0 * d 0 17 Complemento a 2 REGOLA per complementare a 2 Dato un numero positivo N, con bit di segno uguale a 0, per ottenere la rappresentazione in complemento a 2 di -N è possibile impiegare equivalentemente Alg. 1: inverti tutti i bit e somma 1 Alg. 2: inverti tutti i bit a sinistra della cifra 1 meno significativa 18
Regole per complementare a 2 Alg. 1: inverti tutti i bit e somma 1 (dimostrazione) Se la rappresentazione di - N in complementoa 2 è: 1 d n-2 d 1 d 0, il cui valore è: N = -2 n-1 + 2 n-2 * d n-2 + + 2 1 * d 1 + 2 0 * d 0 allora : - N = 2 n-1-2 n-2 * d n-2 - - 2 1 * d 1-2 0 * d 0 = = (2 n-1-1)+1 - (2 n-2 * d n-2 + + 2 1 * d 1 + 2 0 * d 0 ) = = (2 n-2 * 1 + + 2 1 * 1 + 2 0 * 1) - (2 n-2 * d n-2 + + 2 1 * d 1 + 2 0 * d 0 ) + 1 = = (2 n-2 * (1- d n-2 ) + + 20 * (1 - d 0 ) ) + 1 2 n 1 1 = n 2 i= 0 2 poiché (serie geometrica): n i= 0 q i = 1 q 1 q n+ 1 i Sommando e sottraendo 1 19 Regole per complementare a 2 Alg. 1: inverti tutti i bit e somma 1 (dimostrazione - continuazione) Se N è un numero negativo, la rappresentazione di N dovrà essere N = 0 d n-2 d 1 d 0, il cui valore sarà: 2 n-2 * d n-2 + + 2 1 * d 1 + 2 0 * d 0 Quindi il valore del numero negativo N sarà uguale a - 2 n-2 * d n-2 - - 2 0 * d 0 = = (2 n-1-1)-(2 n-1-1) - 2 n-2 * d n-2 - - 2 0 * d 0 = = (2 n-2 * 1 + + 2 0 * 1) - (2 n-1-1) + (2 n-2 * d n-2 + + 2 0 * d 0 ) = = - 2 n-1 + (2 n-2 *(1- d n-2 ) + + 20 *(1 - d 0 )) +1 Alg. 2: basta dimostrare che invertendo fino all 1 meno signifivo si ottiene lo stesso risultato ottenibile applicando l Alg. 1. 20
Estensione numero bit della rappresentazione Regola: copiare il bit più significativo negli altri bit 0010 -> 0000 0010 1010 -> 1111 1010 infatti, il complemento a 2 di 1010 è 110, indipendentemente dal numero di 1 iniziali Esempio di applicabilità: Operandi immediati del MIPS (16 bit) convertiti nella rappresentazione a 32 bis per operazioni aritmetiche tramite estensione del segno" lb vs. lbu lbu non estende il segno del bit più significativo del byte caricato nel registro 21 Addizioni & Sottrazioni Operazioni in complemento a 2 sono facili sottrazioni usando addizioni (sottraendo negativo, espresso in complemento a 2) addizioni di numeri con segno discorde usando semplici somme 7-0111- 0111+ 6= 0110= 1010= 1 0001 0001 Overflow (ovvero, risultato troppo grande per le word finite dei computer): es., la somma di due numeri di n-bit positivi non produce un numero di n-bit positivo 0111 + 0001 nota che qualche volta overflow è fuorviante, 1000 non significa infatti un riporto che va fuori 22
Addizioni & Sottrazioni Perché sommare funziona sempre? Per sottrarre N1 - N2 (numeri di n-bit), N1>0 e N2>0, sommiamo invece (N1 + 2 n - N2) mod 2 n In questo caso non si può verificare overflow. Infatti se: N1 > N2, otterremo un bit di peso n da non considerare (a causa del modulo 2 n ) (N1 + 2 n - N2) mod 2 n = N1 - N2 (poiché (N1 + 2 n - N2)> 2 n ) 7-0111+ 6= 1010= 1 10001 se N1 < N2, il modulo non avrà effetto, (poiché N1 + 2 n - N2) < 2 n ) (N1 + 2 n - N2) mod 2 n = 2 n - (N2 - N1), che corrisponde proprio alla rappresentazione in complemento a 2 di (N2 - N1) 5-0101+ 6= 1010= -1 1111 23 Scoprire gli Overflow No overflow se somma di numeri positivi e negativi No overflow se sottrazione di numeri con segno concorde Overflow se si ottiene un numero con segno diverso da quello aspettato: overflow se sommando due positivi si ottiene un negativo o, sommando due negativi si ottiene un positivo o, sottraendo un negativo da un positivo si ottiene un negativo 0, sottraendo un positivo da un negativo si ottiene un positivo Considera le operazioni A + B, e A B Può succedere overflow se B è 0? Può succedere overflow se A è 0? 24
Scoprire gli Overflow Somma due numeri positivi A e B la cui somma non può essere rappresentata su n-bit in complemento a 2 Overflow se A+B>=2 n-1 A=01111 B=00001 (OVERFLOW due ultimi riporti discordi) A=01100 B=00001 (NON OVERFLOW due ultimi riporti concordi) 01 00 01111+ 01100+ 00001= 00001= 10000 01101 Somma due numeri negativi A e B la cui somma non può essere rappresentata su n-bit in complemento a 2 Overflow se A + B >2 n-1 A=10100 B=10101 (OVERFLOW due ultimi riporti discordi) A=10111 B=11101 (NON OVERFLOW due ultimi riporti concordi) 10 11 10100+ 10111+ 10101= 11101= 01001 10100 25 Effetti dell Overflow Viene generata un eccezione (interrupt) il controllo salta ad indirizzi predefiniti se accade un eccezione l indirizzo dell istruzione interrotta è salvato per la possibile ripresa Non sempre vogliamo scoprire gli overflow nuove istruzioni MIPS: addu, addiu, subu nota: addiu ancora estende il segno! nota: sltu, sltiu per comparazioni di numeri unsigned 26