Esercitazioni di Fondamenti di Informatica - Lez. 1 - Soluzioni 25 Settembre 2017 1 Esercizi sulla codifica binaria Esercizio 1: Quanti bit sono necessari per codificare il numero di auto presenti in un parcheggio da 20 posti? Devo considerare 21 elementi diversi, da il parcheggio è vuoto a il parcheggio è pieno, e il numero di bit necessari è calcolato come log 2 21 + 1 = 4 + 1 = 5. Esercizio 2: Quanti bit sono necessari per codificare 32 capi d abbigliamento di cui 15 pantaloni, 9 camicie e 8 giacche? Le informazioni sulla tipologie dei capi sono trascurabili; ho 32 elementi diversi da rappresentare. Se considero anche la combinazione di 0 capi d abbigliamento, ho 33 elementi da considerare, da 0 a 32: il numero di bit necessari puó essere calcolato come log 2 32 + 1 = 5 + 1 = 6. Se invece non considerassi la combinazione di 0 capi d abbigliamento ho 32 elementi, da 1 a 32. il numero di bit necessari può essere calcolato come log 2 31 +1 = 4+1 = 5. Esercizio 3: Converti 197 10 in base 2. Verifica la correttezza della conversione, riconvertendo il risultato in base 10. 197 :2 98 1 49 0 24 1 12 0 6 0 3 0 1
Quindi 197 10 = 11000101 2. Verifica del risultato: 11000101 2 = 1 2 7 +1 2 6 +0 2 5 +0 2 4 +0 2 3 +1 2 2 +0 2 1 +1 2 0 = 128+64+4+1 = 197 10 Esercizio 4: Converti 584 10 in base 11. Verifica la correttezza della conversione, riconvertendo il risultato in base 10. 584 :11 53 1 4 9 0 4 Quindi 584 10 = 491. Verifica del risultato: 491 = 4 11 2 + 9 1 + 1 1 = 484 + 99 + 1 = 584 10 Esercizio 5: Definire le rappresentazioni in modulo e segno, complemento a uno e complemento a due del numero decimale 8192 10 usando il numero minimo di bit necessari. 8192 :2 4096 0 2048 0 1024 0 512 0 256 0 128 0 64 0 32 0 16 0 8 0 4 0 2 0 Prima convertiamo il valore assoluto del numero in base 2 8192 10 = 2 13 10 = 10000000000000 2 Modulo e segno: primo bit è il segno (0 per valori positivi, 1 per valori negativi), 2
seguito dal valore assoluto del numero in base 2. 8192 10 = 10000000000000 2 = 110000000000000 MS. Complemento a 1: il primo bit è 0 per numeri positivi, 1 per numeri negativi. I numeri positivi sono codificati normalmente, i negativi sono il complemento del valore assoluto in base 2. 8192 10 = 10000000000000 2 = 101111111111111 C1. Complemento a 2: il primo bit è 0 per numeri positivi, 1 per numeri negativi, ma fa parte del numero e non deve essere scartato. Per numeri positivi é il complemento a due la rappresentazione binaria, per i numeri negativi é il complemento a 1 a cui viene sommato il valore 1. 8192 10 = 10000000000000 2 = 01111111111111 C1 + 1 = 10000000000000 C2. Esercizio 6: Spiegare cosa rappresenta il numero binario 1000101 se codificato in modulo e segno, in complemento a 1 e in complemento a 2. Modulo e segno: il primo bit è il segno, 1 è per numeri negativi, il resto è la codifica binaria del valore assoluto del numero. 1000101 MS = 000101 2 = 5 10 Complemento a 1: il primo bit è il segno, il restante é il complemento del valore assoluto del numero. 1000101 C1 = 111010 2 = 58 10 Complemento a 2: é il complemento a uno del numero a cui viene sommato 1. 1000101 C2 = 1000101 1 = 1000100 C1 = 0111011 2 = 59 10 Esercizio 7: Spiegare cosa rappresenta il numero binario 100000 se codificato in: (a) modulo e segno, (b) complemento a 1 e (c) complemento a 2. Modulo e segno: il primo bit è il segno, 1 è per numeri negativi, il resto è la codifica binaria del valore assoluto del numero. 100000 MS = 00000 2 = 0 Complemento a 1: il primo bit è il segno, il restante é il complemento del valore assoluto del numero. 100000 C1 = 11111 2 = 30 Complemento a 2: é il complemento a uno del numero a cui viene sommato 1. 100000 C2 = 32 10. In questo caso il valore binario è il limite inferiore dei valori rappresentabili, che per il complemento a 2 è per convenzione negativo, in questo caso ho 6 bit, quindi ho 2 6 = 32 Esercizio 8: Converti 10.25 10 in base 2. Verifica la correttezza della conversione, riconvertendo il risultato in base 10. Considera separatamente la parte intera dalla parte decimale. 3
10 :2 5 0 2 1 0.25 2 = 0.5 0.5 2 = 1.0 10.25 10 = 1010.01 2 Verifica del risultato: 1010.01 2 = 1 2 3 + 0 2 2 + 1 2 1 + 0 2 0 + 0 2 1 + 1 2 2 = 8 + 2 + 1/4 = 10.25 10 Esercizio 9: Converti 8.375 10 in base 2. Verifica la correttezza della conversione, riconvertendo il risultato in base 10. 8 :2 4 0 2 0 Considera separatamente la parte intera dalla parte decimale. 0.375 2 = 0.75 0.75 2 = 1.5 0.5 2 = 1.0 8.375 10 = 1000.011 2 Verifica del risultato: 1000.011 2 = 1 2 3 +0 2 2 +0 2 1 +0 2 0 +0 2 1 +1 2 2 +1 2 3 = 8+1/4+1/8 = 8.375 10 Esercizio 10: Converti 15.4 10 in base 2. Verifica la correttezza della conversione, riconvertendo il risultato in base 10. 15 :2 7 1 3 1 Considera separatamente la parte intera dalla parte decimale. 4
0.4 2 = 0.8 0.8 2 = 1.6 0.6 2 = 1.2 0.2 2 = 0.4 0.4 è ripetuto, abbiamo un decimale periodico 15.410 = 1111.0110 2 Verifica del risultato: 1111.0110 2 = 1 2 3 +1 2 2 +1 2 1 +1 2 0 +0 2 1 +1 2 2 +1 2 3 = 8+4+2+1+1/4+1/8 = 15.375 10 15.4 10 non ho il numero originale, perchè dovrei considerare i decimali periodici Esercizio 11: Calcolare 8 10 5 10 in base 2 in complemento a 2 usando 5 bit. 8 :2 4 0 2 0 5 :2 2 1 8 10 = 01000 2 5 10 = 00101 2 convertiamo 5 10 nel suo negativo con complemento a 2 usando 5 bit. 5 10 = 11011 2 La somma tra i due numeri binari è adesso diretta. 0 0 0 + 1 = 0 1 I segni degli addendi sono discordi: il risultato è corretto: 8 10 5 10 = 3 10 = 00011 2 Esercizio 12: Calcolare 3 10 2 10 in base 2 in complemento a 2 usando 5 bit. 3 :2 2 :2 3 10 = 00011 2 2 10 = 00010 2 5
convertiamo entrambi i valori nel loro negativo con complemento a 2 usando 5 bit. 3 10 = 11101 2 2 10 = 11110 2 La somma tra i due numeri binari è adesso diretta. 1 + 1 = 1 1 I segni degli addendi sono concordi e uguali al segno del risultato: risultato corretto. 3 10 2 10 = 5 10 = 11011 2 (guarda il valore di -5 in complemento a 2 trovato nell Esercizio 11) Esercizio 13: Calcolare 5 10 6 10 in base 2 in complemento a 2 usando 4 bit. 5 :2 2 1 6 :2 3 0 5 10 = 0101 2 6 10 = 0110 2 convertiamo entrambi i valori nel loro negativo con complemento a 2 usando 4 bit. 5 10 = 1011 2 6 10 = 1010 2 La somma tra i due numeri binari è adesso diretta. 1 1 + 1 0 = 1 I segni degli addendi sono concordi ma diversi dal segno del risultato: risultato errato. In particolare il risultato esatto -11 ha bisogno di più di 4 bit per essere rappresentato in complemento a 2. 5 10 6 10 = 10 0101 2 Esercizio 14: Convertire il numero decimale 3.25 in base 2 in virgola mobile in singola precisione usando lo standard IEEE 754. 3 :2 6
0.25 2 = 0.5 0.5 2 = 1.0 3.25 10 = 11.01 2 = 1.101 2 1 Segno = 0, il numero è infatti positivo Esponente = 1 + 127 = 128 = 10000000 2 Mantissa = 10100000000000000000000 3.25 10 = 0 segno 10000000 esponente 10100000000000000000000 mantissa Esercizio 15: Convertire il numero decimale -23.375 in base 2 in virgola mobile in singola precisione usando lo standard IEEE 754. 23 :2 1 5 1 2 1 0.375 2 = 0.75 0.75 2 = 1.5 0.5 2 = 1.0 23.375 10 = 10111.011 2 = 1.0111011 2 4 Segno = 1, il numero è infatti negativo Esponente = 4 + 127 = 131 = 10000011 2 Mantissa = 01110110000000000000000 23.375 10 = 1 segno 10000011 esponente 01110110000000000000000 mantissa Esercizio 16: Convertire il numero decimale -127.25 in base 2 in virgola mobile in singola precisione usando lo standard IEEE 754. 7
127 :2 63 1 3 15 1 7 1 3 1 0.25 2 = 0.5 0.5 2 = 1.0 127.25 10 = 1111111.01 = 1.11111101 2 6 Segno = 1, il numero è infatti negativo Esponente = 6 + 127 = 133 = 10000101 2 Mantissa = 11111101000000000000000 127.25 10 = 1 segno 10000101 esponente 11111101000000000000000 mantissa Esercizio 17: Convertire il numero decimale -131.5 in base 2 in virgola mobile in singola precisione usando lo standard IEEE 754. 131 :2 65 1 32 1 16 0 8 0 4 0 2 0 0.5 2 = 1.0 131.5 10 = 10000011.1 = 1.00000111 2 7 Segno = 1, il numero è infatti negativo Esponente = 7 + 127 = 134 = 10000110 2 Mantissa = 00000111000000000000000 131.5 10 = 1 segno 10000110 esponente 8 00000111000000000000000 mantissa
2 Esercizi Linguaggio di Von Neumann Scrivere un programma nel linguaggio della macchina di Von Neumann che soddisfi le richieste dell esercizio. Nella soluzione il testo preceduto dal simbolo // è un commento al codice. Esercizio 1: Leggere tre numeri e stampare la loro somma. 0 READ // Leggo i l primo numero 1 STORE 101 // Lo memorizzo i n una c e l l a d i memoria 2 READ // Leggo i l secondo numero 3 STORE 102 // Lo memorizzo 4 READ // Leggo i l t e r z o numero 5 ADD 101 // Posso e v i t a r e di memorizzarlo 6 ADD 102 // Sommo i numeri l e t t i in precedenza 7 WRITE // Stampo i l r i s u l t a t o 8 END Esercizio 2: Leggere due numeri interi positivi e stampare la differenza tra il più grande e il più piccolo 0 READ // Leggo i l primo numero (A) 1 STORE 101 // Lo memorizzo i n una c e l l a d i memoria 2 READ // Leggo i l secondo numero (B) 3 STORE 102 // Lo memorizzo 4 SUB 101 // Sottraggo da B ( n e l l accumulatore ) A ( in c e l l a di memoria ) 5 BGE 8 // c o n t r o l l o (B A) >= 0 ; se e vero s a l t a a l l a stampa 6 LOAD 101 // a l t r i m e n t i c a r i c o i l primo numero 7 SUB 102 // s o t t r a g g o da A ( in accumulatore ) B ( in c e l l a di memoria ) 8 WRITE // stampo i l r i s u l t a t o in accumulatore 9 END Esercizio 3: Leggere un numero n e stampare la somma dei successivi n numeri letti. 0 LOAD= 0 // i n i z i a l i z z a accumulatore a 0 1 STORE 101 // memorizza v a l o r e i n i z i a l e accumulatore (somma f i n a l e ) 2 READ // l e g g i i l numero n 3 STORE 102 // s a l v a i l numero e u s a l o come c o n t a t o r e 4 BLE 11 // c o n t r o l l a se c o n t a t o r e e <=0 ; se vero, s a l t a a f i n e c i c l o 5 READ // se c o n t r o l l o e f a l s o, l e g g i un numero 6 ADD 101 // somma numero l e t t o a somma i n memoria 7 STORE 101 // aggiorna v a l o r e somma p a r z i a l e 8 LOAD 102 // c a r i c a i l c o n t a t o r e 9
9 SUB= 1 // decrementa c o n t a t o r e di 1 ( una i t e r a z i o n e in meno) 10 BR 4 // f i n e i t e r a z i o n e, s a l t a a l l i n i z i o d e l c i c l o 11 LOAD 101 // c a r i c a v a l o r e somma f i n a l e 12 WRITE // stampa somma f i n a l e 13 END Esercizio 4: Leggere una sequenza di numeri terminata da uno 0 e stampare la somma dei soli numeri positivi. 0 LOAD= 0 // i n i z i a l i z z a accumulatore a 0 1 STORE 101 // memorizza v a l o r e i n i z i a l e accumulatore (somma f i n a l e ) 2 READ // l e g g i un numero 3 BEQ 8 // se numero l e t t o e = 0, termino i l c i c l o 4 BL 2 // se numero e < 0, s a l t a i l numero 5 ADD 101 // a l t r i m e n t i somma i l numero a l l a somma p a r z i a l e in memoria 6 STORE 101 // aggiorna somma p a r z i a l e 7 BR 2 // s a l t a a i n i z i o c i c l o 8 LOAD 101 // c a r i c a somma f i n a l e 9 WRITE // stampa somma f i n a l e 10 END 10