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