Aritmetica dei Calcolatori

Aritmetica dei Calcolatori
Luca Abeni
March 5, 2014
Codifica dei Numeri Interi
■
k bit → codificano 2k simboli/valori/numeri...
◆ Si usa la base 2 per codificare i numeri
◆ Numeri naturali n ∈ N : valori da 0 a 2k − 1
■
Come codificare numeri interi z ∈ Z?
◆ Problema: numeri negativi z < 0 ⇒ z ∈
/N
◆ Si codificano sempre 2k valori...
◆ ... Ma quali???
■
IEP1
Varie possibilit`a: modulo e segno, complemento a 1, complemento a 2,
...
Luca Abeni – 2 / 15
Codifica con Modulo e Segno
■
Idea semplice: si usano k − 1 bit per rappresentare il valore assoluto
(modulo) del numero...
■
...Ed un bit per codificare il segno!
◆ bit pi`
u significativo a 0: numero positivo
◆ bit pi`
u significativo a 1: numero negativo
■
Valori codificati: da −2k−1 + 1 a 2k−1 − 1
◆ 2k − 1 valori???
◆ Come mai??? Due diverse sequenze di bit per codificare lo 0? (+0
e −0???)
k−1
z
■
IEP1
}|
k−1
{
z
}|
{
1 000 . . . 0 vs 0 000 . . . 0
Luca Abeni – 3 / 15
Codifica in Complemento a 1
■
Altra idea semplice: i numeri negativi si rappresentano facendo il
complemento ad 1 del valore assoluto
◆ Numero positivo: rappresento il valore assoluto
◆ Numero negativo: cambio 0 in 1 e viceversa (complemento a 1 di
k
z }| {
x: 1 . . . 1 −x = (2k − 1) − x)
◆ Numeri positivi: ancora, bit pi`
u significativo a 0
k
z
IEP1
}|
k
{
z
}|
{
■
Ancora, due rappresentazioni dello 0 (+0 e −0)? 111 . . . 1 vs 000 . . . 0
■
Modulo e segno → Non facile da sommare...
■
Complemento a 1 → a volte le cose vanno meglio (se il bit pi`
u
significativo non da’ riporto, OK)
Luca Abeni – 4 / 15
Somma di Numeri in Complemento a 1
■
Algoritmo per sommare numeri interi codificati in complemento a 1:
1. Sommare le rappresentazioni dei due numeri
2. Se la somma del bit pi`
u significativo da’ riporto, sommarlo al
risultato
3. Se i riporti delle due cifre pi`
u significative della nuova somma sono
uguali, il risultato `e attendibile
4. Altrimenti, il risultato non `e rappresentabile su k bit
■
Esempio: 6 + −3 (codifica su 5 bit)
1
◆ 6 = 00110; −3 = 00011 = 11100
1
0
1
0
1
0
1
0
1
1
0
1
0
1
0
0
0
◆ 00010 + 1 = 00011 (= 3)
IEP1
Luca Abeni – 5 / 15
Complemento a 2
■
Complemento a 2 di un numero binario:
◆ Scorrere i bit a partire dalla destra
◆ Fino al primo bit che vale 1 (compreso), lasciare invariato
◆ A partire dal bit successivo, fare il complemento a 1
■
Equivalente a fare il complemento a 1 e poi sommare 1
k
z }| {
◆ Complemento in base 2 di x: 2k − x = 1 0 . . . 0 −x
■
Esempio: complemento in base 2 di 87 (= 10101112 )
◆ L’1 pi`
u a destra rimane invariato; inverto le altre cifre. 0101001
◆ 272 − 10101112 = 100000002 − 10101112 = 101001
◆ Complemento a 1 +1: 0101000 + 1 = 101001
IEP1
Luca Abeni – 6 / 15
Codifica in Complemento a 2
■
Numeri positivi: rappresentare il valore assoluto
■
Numeri negativi: rappresentati usando il complemento a 2 del valore
assoluto
◆ Ancora, il bit pi`
u significativo indica il segno
◆ Stavolta, la codifica dello 0 `
e unica
◆ Codifica i numeri da −2k−1 a 2k−1 − 1
■
E stavolta, la somma `e semplice...
◆ x + (−y) = x + (2k − y) = 2k + x − y...
◆ ...Su k bit, questo `
e equivalente a x − y
IEP1
Luca Abeni – 7 / 15
Esempi di Codifica
decimale
-4
-3
-2
-1
0
1
2
3
IEP1
modulo e segno
complemento a 1
111
110
101
100 / 000
001
010
011
100
101
110
111 / 000
001
010
011
complemento a 2
100
101
110
111
000
001
010
011
Luca Abeni – 8 / 15
Somme e Sottrazioni in Base 2
■
Come normalmente in base 10 (numeri in colonna, riporto, etc...)
■
Se si usa complemento a 2, funziona anche con numeri negativi
◆ Ma occhio agli overflow!!!
◆ Overflow? Numeri su k bit, ma risultato non rappresentabile su k
bit
◆ Matematica “dell’orologio”...
IEP1
0
0
0
1
0
0
1
1
0
1
0
1
1
0
0
0
0
1
0
1
■
Esempi: k = 6, 5 + 12
■
k = 7, 5 − 8; k = 7, −5 + 8; k = 7, −64 − 8; k = 7, 63 + 1;
Luca Abeni – 9 / 15
Esempi Senza Overflow
■
k = 7, 5 − 8
◆ 5 = 00001012 ; −8 = 00010002 + 12 = 11101112 + 12 = 11110002
0
1
1
0
1
1
0
1
1
0
1
1
1
0
1
0
0
0
1
0
1
◆ 11111012 =... −(11111012 + 12 ) = −00000112 = −3
■
k = 7, −5 + 8
◆ −5 = 00001012 + 1 = 11110102 + 12 = 1111011; 8 = 00010002
1
1 1 1
1 1 1
0 0 0
0 0 0
◆ 00000112 = 3
IEP1
0
1
1
0
0
0
0
0
0
1
0
1
0
1
0
1
Luca Abeni – 10 / 15
Esempio di Overflow
■
k = 7, −64 − 8
◆ 64 = 10000002 ;
−64 = 10000002 + 12 = 01111112 + 12 = 10000002
◆ 8 = 00010002 ; −8 = 00010002 + 12 = 11101112 + 12 = 11110002
1
1
1
0
0
1
1
0
1
1
0
1
1
0
0
0
0
0
0
0
0
0
◆ 01110002 = 56... WTH??? Sommando 2 numeri negativi si ottiene
un numero positivo???
■
−64 − 8 = −72...
◆ Posso rappresentare numeri fra −26 = −64 e 26 − 1 = 63...
◆ −72 non `
e rappresentabile!!!
IEP1
Luca Abeni – 11 / 15
Esempio di Overflow
■
k = 7, 63 + 1
◆ 63 = 01111112
◆ 1 = 000000012
1
0
0
1
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
◆ 10000002 = −(10000002 + 1) = −(01111112 + 12 ) = −1000000 =
−64... WTH??? Sommando 2 numeri positivi si ottiene un numero
negativo???
■
IEP1
Ancora, il risultato corretto (63 + 1 = 64) non sarebbe rappresentabile...
Luca Abeni – 12 / 15
Esempi ed Esercizi
■
Numeri su k = 7 bit, codificati in complemento a 2
■
Verificare se c’`e overflow
◆ 0110110 + 0000011
■
Somma di due numeri positivi: mi aspetto risultato positivo...
◆ 1001010 + 1111101
■
Somma di due numeri negativi: mi aspetto risultato negativo...
◆ 1001010 + 1100000
◆ 0100000 + 1111010
◆ 1100000 + 0000110
IEP1
Luca Abeni – 13 / 15
La Matematica dell’Orologio
■
Aritmetica modulare: considero solo n numeri interi
◆ Numeri da 0 a n − 1...
◆ ...O numeri da −n/2 a n/2 − 1...
■
Quando contando arrivo al numero pi`
u grande, riparto dal pi`
u piccolo
◆ Se i numeri vanno da 0 a n − 1, contando dopo (n − 1) + 1 = 0
(contando dopo n − 1 riparto da 0)
◆ Se i numeri vanno da −n/2 a n/2 − 1, contando dopo
n/2 − 1 + 1 = −n/2
` come se i numeri stessero sul quadrante di un orologio!
◆ E
■
Definizione pi`
u formale: si usano classi di congruenza modulo n
◆ Relazione di equivalenza fra due numeri: a ≡ b ⇔ a%n = b%n
IEP1
Luca Abeni – 14 / 15
Cosa Succede in Caso di Overflow?
■
Operazioni su numeri naturali rappresentati su k bit → aritmetica
modulo 2k
◆ Calcolando a + b si ottiene in realt`
a (a + b)%2k ...
◆ ...Se il risultato della somma `
e < 2k , allora (a + b)%2k = a + b ←
no overflow!
◆ Altrimenti, in risultato appare “strano”...
■
Usando rappresentazione in complemento a 2 dei numeri interi, il
discorso `e analogo:
◆ Se il risultato di una somma a + b `
e compreso fra −2k−1 e
2k−1 − 1, allora no overflow (risultato corretto)!
◆ Se il a + b < −2k−1 , ottengo a + b + 2k . Positivo!!! Overflow!
◆ Se il a + b > 2k−1 − 1, ottengo a + b − 2k . Negativo!! Overflow!
IEP1
Luca Abeni – 15 / 15