Numeri Negativi
La parola del processore MIPS è di 32 bit.
31
0
Esistono 232 configurazioni distinte che permettono di
rappresentare (in base 2) tutti gli interi positivi compresi tra 0 e
232 –1.
31
N= ∑
i
ai
0
a2 a1 a0
0
i=0
ai 2i
ai =
1
Per rappresentare anche i numeri negativi sono state proposte
principalmente tre soluzioni.
1) segno e modulo
2) complemento a 1
3) complemento a 2
In tutti i casi il bit meno significativo (bit 31) viene utilizzato per
rappresentare il segno (0 per i numeri positivi, 1 per i numeri
negativi).
Con la convenzione segno e modulo i rimanenti 31 bit vengono
usati per rappresentare il modulo del numero relativo considerato.
Quando si utilizza la convenzione del complemento (a 1 o a 2), se
il numero considerato è negativo la sequenza dei 31 bit rimanenti
non rappresenta il modulo (M) del numero ma il numero N:
N = 231 –1 – M
(complemento a 1)
N = 231 – M
(complemento a 2)
Il processore MIPS utilizza la convenzione del complemento a 2.
Esempio
M = 22 + 2 0
31
0
00000000000000000000000000000101
231 = 230 + 229 + … .. + 22 + 21 + 20 + 1
-M =
- 22
- 20
N = 231 – M = 230 + 229 + … .. + 22 + 21 + 20 + 1
31
0
11111111111111111111111111111011
N.B.
M = 231 – N
Riapplicando la stessa regola e ponendo a 0 il bit del
segno si riottiene la configurazione iniziale.
Sia
a31 a30
… .. … … … … ..
a2 a1 a0
la sequenza di bit che rappresenta, con la convenzione
“complemento a 2”, un numero relativo.
Se il numero è positivo ( = 0) allora la sequenza rappresenta il
numero ∑ i=0 ai 2i
Se il numero è negativo ( = 1) allora la sequenza rappresenta il
numero - 231 + ∑ i=0 ai 2i
La notazione decimale di un numero relativo rappresentato, con la
convenzione “complemento a 2”, dalla sequenza di bit
a31 a30 … .. … … … … .. a2 a1 a0
a31 × (- 231) + ∑
è quindi:
30
i=0
ai 2i
0
a31 × (- 231) + ∑
i=0
a i 2i = ∑
1
a31 × (- 231) + ∑
i=0
ai 2i = - 231 + ∑
i=0
ai 2i
a31 =
Esempio con parola di 4 bit:
0
1
0
1
5 = 22 + 2 0
M=5
1
0
N = 23 –5 = 3
1
1
- 5 = - 2 3 + 21 + 2 0
i=0
ai 2i
30
Sviluppando 231 come visto prima (231 = ∑ i=0 2i +1), si
ottiene un metodo veloce per la complementazione a 2 di una
sequenza a31 a30 … .. … … … … .. a2 a1 a0 di bit
1 × 230 + … .. + 1 × 22 + 1 × 21 + 1 × 20 + 1
- M = – a30 × 230
– a2 × 22 – a1 × 21 – a0 × 20
231 =
N = 231 – M = a30 × 230
+a2 × 22 +a1 × 21 +a0 × 20 + 1
La parola
31
0
00000000000000000000000000000101
viene prima trasformata in
31
0
11111111111111111111111111111010
(ogni bit viene sostituito dalla sua negazione)
e viene poi aggiunto 1
31
0
11111111111111111111111111111011
Somma e sottrazione binarie
Somma: somma bit a bit con riporto:
0000 0000 0000 0000 0000 0000 0000 1011 +
0000 0000 0000 0000 0000 0000 0000 0010 =
0000 0000 0000 0000 0000 0000 0000 1101
Sottrazione: sottrazione bit a bit oppure somma bit a bit con il
complemento a 2 del secondo operando.
0000 0000 0000 0000 0000 0000 0000 1101 0000 0000 0000 0000 0000 0000 0000 1011 =
0000 0000 0000 0000 0000 0000 0000 0010
0000 0000 0000 0000 0000 0000 0000 1101 +
1111 1111 1111 1111 1111 1111 1111 0101 =
0000 0000 0000 0000 0000 0000 0000 0010
Overflow
Gli interi relativi rappresentabili vanno da - 231 a 231 – 1.
Gli interi positivi rappresentabili vanno da 0 a 231
Applicando operazioni di somma e sottrazione è possibile che il
risultato non sia più rappresentabile.
Per la somma, l’overflow non può verificarsi se gli operandi
hanno segno opposto: in questo caso il modulo del risultato è
minore a quello di almeno uno dei due operandi.
- 231 ______ X ___________ 0 ______ Y ________ 231 – 1
Z
Sommando due numeri possono verificarsi situazioni di overflow
solo se i numeri hanno lo stesso segno. E’quindi possibile
riconoscere l’overflow controllando il segno del risultato ottenuto.
Per la sottrazione vale il principio opposto.
A
B
R
≥0
≤0
≥0
≤0
<0
>0
somma A+B
≥0
<0
<0
≥0
<0
≥0
sottrazione A-B
Signed /Unsigned
Alcuni linguaggi di programmazione (esempio C) permettono di
dichiarare sia interi relativi (int) che quelli solo positivi (unsigned
int).
Gli interi relativi rappresentabili vanno da
- 231 a 231 – 1
Gli interi positivi rappresentabili vanno da
0 a 231
Le operazioni di confronto devono tener conto delle diverse
rappresentazioni usate.
slt (set less than)
slti (set less than immediate)
operano nell’ipotesi che
i numeri siano relativi
sltu (set less than unsigned)
sltiu (set less than immediate un.)
operano nell’ipotesi che
i numeri siano unsigned
Anche le istruzioni di caricamento di byte possono tener conto del
segno.
lb (load byte) - tratta il byte come un numero relativo e pertanto
“estende il segno”, cioe’completa la parola estendendo ai 24 bit
in testa il segno:
1 1 0 1 0 1 1 0
31
0
11111111111111111111111111010110
lbu (load byte unsigned) - tratta il byte come un numero unsigned.
1 1 0 1 0 1 1 0
31
0
00000000000000000000000011010110