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