modificato da andynaz Cambiamenti di base Tecniche Informatiche di Base TIB 1 Il sistema posizionale decimale modificato da andynaz L’idea del sistema posizionale: ogni cifra ha un peso Esempio: 132 = 100 + 30 + 2 = 1·102 + 3·101 + 2·100 Un numero generico N, in base 10, è rappresentato dalla sequenza di cifre: an, an-1, an-2,..., a0 an cifra più significativa, a0 cifra meno significativa ai ∈ {0, 1, ..., 9} insieme delle cifre utilizzabili Notazione: N10=(an an-1 an-2 ... a0)10 2 modificato da andynaz Rappresentazione in base p Nel sistema posizionale, un numero naturale N, composto da n cifre, in base p, si esprime come: N p = an ⋅ p + an −1 ⋅ p n n −1 n + ... + a1 ⋅ p + a0 ⋅ p = ∑ ai ⋅ p i 1 0 i =0 Esempio (p=5): (412)5 = 4·52+1·51+2·50 Posso rappresentare i numeri nell’intervallo discreto: [0 , pm — 1] . N in base p ha k =[ log p N ]1 cifre 3 Conversione base dieci base p modificato da andynaz Si effettuano delle divisioni intere successive, fermandosi quando si ha quoziente pari a 0 e considerando i resti dall'ultimo al primo Esempio, 1410=(???)3 14 : 3 = 4 4:3=1 1:3=0 resto = 2 resto = 1 resto = 1 Dunque 1410 = (112)3 4 Conversione base p base 10 modificato da andynaz Si sviluppa ogni cifra del numero con la giusta potenza di p. Esempio, (1110)2=(???)10 (1110)2 = (1·23 + 1·22 + 1·21 + 0·20)10 = (8 + 4 + 2)10 = 1410 5 Conversione base p base r modificato da andynaz Il modo più semplice è effettuare due conversioni: base p base 10 Base 10 base r Esempio: (25)7 = (???)3 (25)7 = (2·7 + 5)10 = 1910 1910 = (201)3 Ci sono in alcuni casi delle scorciatoie... 6 modificato da andynaz Binario, base ottale e base esadecimale 7 Base due (o base binaria) modificato da andynaz Base binaria o base due: (p=2) In m bit posso rappresentare i numeri nell’intervallo discreto: [0 , 2m —1] Esempio: con m=8, rappresento numeri nell'intervallo [000000002 , 111111112], ovvero [010 , 25510] 8 Base ottale (o base otto) p=8; modificato da andynaz ai ∈ {0, 1, 2, 3, 4, 5, 6, 7} Esempio: 2348 = (2·82 + 3·81 + 4·80)10 = 15610 Sapendo che 8 = 23: conversione binario ottale Esempio: 1011111002 = (???)8 1012 = (1⋅22+0⋅21+1⋅20 )10 = 510 = 58 1112 = (1⋅22+1⋅21+1⋅20 )10 = 710 = 78 1002 = (1⋅22+0⋅21+0⋅20 )10 = 410 = 48 Quindi, 1011111002 = 5748 Sapendo che 8 = 23: conversione ottale binario Esempio: 1268 = (???)2 18 = 110 = 0012 28 = 210 = 0102 68 = 610 = 1102 Quindi, 1268 = 0010101102 9 Base esadecimale (o base sedici) p=16; modificato da andynaz ai ∈ {0, 1, 2, …, 9, A, B, C, D, E, F} “B” al posto di “11” e “F” al posto di “15” Esempio: B7F16 = (11·162 + 7·161 + 15·160)10 = 294310 Sapendo che 16=24: Conversione binario esadecimale Esempio: 1011111012 = (???)16 00012 = (0⋅23+0⋅22+0⋅21+1⋅20)10 = 110 = 116 01112 = (0⋅23+1⋅22+1⋅21+1⋅20)10 = 710 = 716 11012 = (1⋅23+1⋅22+0⋅21+1⋅20)10 = 1310 = D16 Quindi, 1011111012 = 17D16 Sapendo che 16=24: Conversione esadecimale binario Esempio: A316 = (???)2 A16 = 1010 = 10102 316 = 310 = 00112 Quindi, A316 = 101000112 10 modificato da andynaz Codifiche 11 Codifiche modificato da andynaz Un calcolatore tratta solo informazioni binarie Per poter trattare vari tipi di numeri (interi senza segno, interi con segno, frazioni, etc...) ho bisogno di codifiche: permettono di associare ad ogni sequenza binaria un particolare valore danno delle regole per gestire e convertire queste stringe Ci sono codifiche anche per codici non numerici 12 modificato da andynaz Numeri naturali (numeri senza segno) 13 modificato da andynaz Numeri naturali Vengono semplicemente scritti in base 2!!! Num. intero, base 10 Num. intero, base due 0 0 1 1 2 10 3 11 4 100 5 101 tra i numeri e la loro 6 110 scrittura 7 111 ai ∈ {0, 1} chiamati bit (binary digit) Una sequenza di otto bit è detta byte Ho in questo modo una corrispondenza biunivoca 14 modificato da andynaz Somma Le cifre sono 0 e 1 si usano le elementari regole dell'addizione il riporto può essere solo 1 Riporto precedente 0 0 0 1 1 1 Somma Risultato Riporto 0 0 1 1 + + + + 0 1 0 1 0 0 1 0 0 1 0 0 1 1 + + + + 0 1 0 1 1 0 0 1 1 1 15 Overflow modificato da andynaz Con m bit posso rappresentare i numeri interi nell'intervallo [0, 2m-1] non è un insieme chiuso rispetto alla somma Nel caso si abbiano un numero limitato di bit a disposizione, si può avere il caso particolare di carry (riporto) sulla cifra più significativa Esempio: calcoliamo 9+7 utilizzando 4 bit (1001)2 + (0111)2 = (10000)2 4 bit non sono sufficienti a scrivere 16: overflow 16 modificato da andynaz Somma e carry Esempio: 1 riporto 0101 + (510) 1001 = (910) -----1110 (1410) 111 riporti 1111 + 1010 = ------carry 11001 (1510) (1010) (2510 se uso 5 bit; 910 se considero 4 bit: errato) . 17 modificato da andynaz Numeri interi (numeri con segno) 18 Modulo e segno modificato da andynaz Non posso memorizzare il “segno”, uso una codifica Uso il bit più a sinistra per memorizzare il segno: “1” significa numero negativo “0” numero positivo In m bit posso memorizzare i numeri nell'intervallo [-2m-1+1, 2m-1-1] 19 modificato da andynaz Modulo e segno (problemi) Come posso fare la somma (con numeri di segno discorde o con numeri negativi)?? Ho due rappresentazioni dello 0 Esempio m=3: Num. intero, base 10 –3 Num. intero, base due, modulo e segno 111 –2 110 –1 101 –0 100 +0 000 +1 001 +2 010 +3 011 ? 20 Complemento a due (CPL2) modificato da andynaz Risolve i problemi della precedente rappresentazione In m bit posso rappresentare i numeri nell’intervallo: [–2m—1 , 2m—1 — 1] Esempio (m=8): [–128, +127], perché –27 = –128 e 27—1 = +127 Tutti i numeri negativi cominciano con il bit più significativo posto a “1” Tutti i positivi e lo zero iniziano con il bit più signifatico posto a “0” 21 Conversione decimale CPL2 modificato da andynaz Se ho m bit e voglio scrivere N in CPL2 se N ∈[0, 2m−1−1] allora N viene convertito in binario “senza segno” utilizzando tutti i bit a disposizione se m −1 N ∈[−2 , −1] allora viene effettuato il complemento a 2, ovvero: |N | viene scritto in binario “senza segno”, utilizzando tutti i bit a disposizione si complementano tutti i bit (si scambiano tra loro 0 e 1) si aggiunge 1 22 modificato da andynaz Complemento a due (CPL2) Usando m bit: (–N)CPL2 = (2m — N10)2 Esempio (m=3) : (–N)CPL2 = (23 — N10)2 Num. intero base 10 Trasformazione Num. intero, base 2, CPL2, m=3 -4 8–4=4 410 = 100 -3 8–3=5 510 = 101 -2 8–2=6 610 = 110 -1 8–1=7 710 = 111 0 nessuna 010 = 000 1 nessuna 110 = 001 2 nessuna 210 = 010 3 nessuna 310 = 011 23 Conversione decimale CPL2 (esempi) modificato da andynaz Esempio: –210 con m=8 bit: 210 = 000000102 111111012 + 12 = --------------111111102 Esempio: –510 con m=? bit: provo con m=2,3,4 e scopro che –5 ≥ –2(4—1), allora m=4; adesso codifico –5 con m=4 bit: 510 = 01012 10102 + 12 = --------10112 24 Conversione CPL2 decimale (1) modificato da andynaz Se il numero è positivo (bit più significativo posto a “0”), lo converto usando la solita sommatoria Se il numero è negativo (bit più significativo posto a “1”), allora: sottrago 1 complemento i bit Considero il numero risultante N2 come un NATURALE (cioè come un numero senza segno, l’eventuale 1 iniziale non indica più il segno) e lo converto con la solita sommatoria. Ottengo N10 A questo punto, il numero decimale è –N10 25 Conversione CPL2 decimale (2) modificato da andynaz Se il numero è positivo (bit più significativo posto a “0”), lo converto usando la solita sommatoria Se il numero è negativo (bit più significativo posto a “1”), allora: Calcolo il modulo del numero, ovvero applico ancora su di esso il CPL2 Considero il numero risultante N2 come un NATURALE (cioè come un numero senza segno, l’eventuale 1 iniziale non indica più il segno) e lo converto con la solita sommatoria. Ottengo N10 A questo punto, il numero decimale è –N10 26 Conversione CPL2 decimale (esempio) modificato da andynaz Esempio: 10000012 = (???)10 Numero negativo Applichiamo CPL2 e otteniamo: 01111112 Consideriamolo un naturale e convertiamolo usando la solita sommatoria: 01111112 = 6310 Allora 10000012 = –6310 Esempio: 01010012 = (???)10 Numero positivo Convertiamolo usando la solita sommatoria: 01010012 = 4110 . 27 Somma e sottrazione in CPL2 modificato da andynaz Somma: come per i naturali Sottrazione: N1 — N2 = N1 + (–N2)CPL2 Carry: Il bit di carry non viene considerato! Overflow: Se, sommando due interi di m bit dotati di segno concorde, ottengo un risultato di segno discorde (sempre considerando m bit), allora si ha un overflow (il risultato non è codificabile su m bit) e l’operazione è errata L’overflow non può verificarsi se gli operandi sono di segno discorde. 28 modificato da andynaz Somma e sottrazione in CPL2 (esempi 1) m=7 cioè da –6410 a +6310 0000101 + carry (+510) 1111000 = (–810) --------1111101 (–310) 1111 riporti 1111011 + 0001000 = ---------10000011 10000011 (-510) (+810) (butto via il carry) (+310) . 29 Somma e sottrazione in CPL2 (esempi 2) carry 1 riporti 1000000 + 1111000 = ---------10111000 0111000 modificato da andynaz (–6410) (–810) (butto via il carry) (+5610: sbagliato; dovrebbe essere –7210) Overflow: –7210 non è codificabile su 7 bit in CLP2 11111 riporti 0111111 + (+6310) 0000010 = (+210) --------1000001 (–6310: è sbagliato; dovrebbe essere +6510) Overflow: +6510 non è codificabile su 7 bit in CPL2 . 30 I Flag modificato da andynaz Insieme di “segnalatori”, calcolati dopo ogni istruzione: • • • • • Z (Zero). Vale “1” sse il risultato dell’addizione è zero; “0” altrimenti N (Negative). Vale “1” sse il risultato dell’addizione è negativo; “0” altrimenti C (Carry). Vale “1” sse l’addizione ha prodotto un carry; “0” altrimenti V (oVerflow). Vale “1” sse l’addizione ha prodotto un overflow; “0” altrimenti Per esempio, nell’esercizio che aveva per risultato 10000012, avrei ottenuto: Z=0; N=1; C=0; V=1 I Flag sono usati da alcune istruzioni della macchina di Von Neumann 31 Conclusione • • modificato da andynaz Se si opera con numeri che si considerano naturali, si sta attenti al Flag di carry (C), se si opera con numeri che si considerano interi, si sta attenti al Flag di overflow (V) I Flag sono computati tutti, al termine di ogni istruzione (escluse le istruzioni di salto) Come fa a macchina di Von Neumann a sapere se sta operando su numeri naturali o interi? Semplicemente, NON LO SA! Le operazioni che la macchina esegue sono identiche in entrambi i casi, soltanto l’interpretazione dei risultati cambia . 32 modificato da andynaz Numeri reali 33 Parte frazionaria di un numero modificato da andynaz Un numero reale x è la somma di [x] + {x} Rappresentiamo la parte frazionaria di un numero reale In base 2, un numero frazionario N (0<=N <1), composto da n cifre, si esprime come: −1 −2 N 2 = a−1 ⋅ 2 + a− 2 ⋅ 2 + ... + a− n ⋅ 2 −n = −1 i a ⋅ 2 ∑ i i=− n Date n cifre in base 2, posso rappresentare i numeri nell’intervallo: [02 , 0,111…12], ovvero [0, 1—2—n] l’errore di approssimazione è ε < εmax = 2—n 34 Conversione binario decimale modificato da andynaz Si espande semplicemente il numero, similimente alla codifica in binario dei numeri naturali Esempio: n= 3 (0,101)2 = (1•2-1 + 0•2-2 + 1•2-3)10 = (0,875)10 εmax = 2—3 = 0,125 35 Conversione decimale binario modificato da andynaz Per passare dalla base 10 alla base 2 si moltiplica di seguito la parte frazionaria per due e si considera la parte intera Termino quando: ho utilizzato tutti gli n bit a disposizione ottengo 1 A questo punto prendo le parti intere dalla prima all'ultima 36 Conversione decimale binario (esempio) • Convertiamo (0,21)10 avendo n=6: 0,21 0,42 0,84 0,68 0,36 0,72 • • modificato da andynaz × × × × × × 2 2 2 2 2 2 = = = = = = 0,42 0,84 1,68 1,36 0,72 1,44 parte parte parte parte parte parte intera intera intera intera intera intera = = = = = = 0 0 1 1 0 1 parte parte parte parte parte parte fraz. fraz. fraz. fraz. fraz. fraz. = 0,42 = 0,84 = 0,68 = 0,36 = 0,72 = 0,44 Prendo le parti intere, dalla prima all’ultima 0,2110 ≈ 0,0011012 Riconvertendo: 0,0011012 = 0,20312510 ε=0,21—0,203125=0,006875 ε < εmax = 2—6=0,015625 37 Numeri fazionari (nota) modificato da andynaz Si noti che un numero frazionario decimale finito può avere uno sviluppo binario infinito periodico Esempio: (0,3)10 = (0,010011001100110011...)2 Non è però possibile il contrario!! 38 modificato da andynaz Virgola fissa Uso m bit e n bit per parte intera e frazionaria Esempio (m=8, n=6, tot. 14 bit): -123,2110 -12310 = 100001012 0,2110 ≈ 0011012 -123,2110 ≈ 10000101,0011012 Come scelgo m e n? Precisione costante lungo ℝ : 0 ℝ 39 modificato da andynaz Virgola mobile (floating point) Il numero è espresso come: r = m·bn m e n sono in base p m: mantissa (numero frazionario con segno) b: base della notazione esponenziale (numero naturale) n: caratteristica (numero intero) Esempio (p=10, b=10): -331,6875 = –0,3316875⋅103 m = –0,3316875 n=3 Precisione variabile lungo ℝ . Per es. con 5 cifre per m: 13212,4323 = 0,13212⋅105 = 13212 (ho perso 0,4323) 7,345312 = 0,73453⋅101 = 7,3453 (ho perso 0,000012) ℝ 0 40 modificato da andynaz Virgola mobile (floating point) Mantissa (m): Codifico solo la parte a destra della virgola Codifico il segno • l1 bit Caratteristica (n): • l2 bit m con segno (l1 bit) n (l2 bit) 41 Virgola mobile (floating point) • • modificato da andynaz Quando la prima cifra a destra della virgola è diversa da zero, il numero in virgola mobile si dice normalizzato Es. –0,3716875⋅103 è normalizzato perché la prima cifra a destra della virgola è “3” La normalizzazione permette di avere, a parità di cifre usate per la mantissa, una maggiore precisione. Es. Uso l1=5 cifre per la mantissa: +45,6768 ≈ +0,45676⋅102 ≈ +0,00456⋅104 Ho perso 0,0008 Ho perso 0,0768 42 modificato da andynaz Caratteri 43 Caratteri modificato da andynaz Codifica numerica ASCII (American Standard Code for Information Interchange) utilizza 7 bit (estesa a 8 bit) L’ASCII codifica I caratteri alfanumerici (lettere maiuscole e minuscole e numeri), compreso lo spazio I simboli (punteggiatura, @, ecc) Alcuni caratteri di controllo (TAB, LINEFEED, RETURN, BELL, ecc) . 44 modificato da andynaz Tabella ASCII (parziale) DEC 48 CAR 0 DEC 65 CAR A DEC 75 CAR K DEC 97 CAR a DEC 107 CAR k 49 1 66 B 76 L 98 b 108 l 50 2 67 C 77 M 99 c 51 3 68 D 78 N 100 d 109 m 110 n 52 4 69 E 79 O 101 e 111 o 53 5 70 F 80 P 102 f 112 p 54 6 71 G 81 Q 103 g 113 q 55 7 72 H 82 R 104 h 114 r 56 8 73 I 83 S 105 i 115 s 57 9 74 J 84 T 106 j 116 t 85 U 117 u 86 V 118 v 87 W 119 w 88 X 120 x 89 Y 121 y 90 Z 122 z 45 modificato da andynaz Tabella ASCII Anche le cifre numeriche sono codificate Le lettere sono in sequenza alfabetica Per passare dal minuscolo al maiuscolo: Codicemaiuscolo = Codiceminuscolo – 3210 Alcuni caratteri sulla tastiera italiana: ALT-123=“{“ oppure SHIFT-ALTGR-[ ALT-125=”}” oppure SHIFT-ALTGR-] ALT-126=”~” 46 Raissunto codifiche modificato da andynaz Ad una stringa binaria deve essere associato un significato: la codifica fa questo Esempio: la stringa 1101010 può essere 106 in binario puro -42 in modulo con segno -22 in complemento a 2 j nel codice ASCII 47