SOMMA IN MODULO E SEGNO Sia n 1 X x 0 2 xi 2 x 0 2 X 0 i i 1 n 1 0 Y y0 2 yi 2 y0 2 Y 0 i 0 * i 1 Caso a) X e Y stesso segno (entrambi positivi o negativi. Si esegue la moduli. Risultato: 1 somma dei * n 1 Z X Y z0 2 ( xi yi ) 2 0 i 1 z0 x0 y0 dove (stesso segno). Esempio: X 510 101012 e Y 710 101112 -5 -7 -12 0101 + 0111 = 1100 Z = 11100 Se X Y 2 , si ha overflow. * * 0 2 i Caso b) X e Y di segno discorde. Sottocaso I) X Y * * Si deve eseguire X Y * * * e il segno è quello di X . 3 Sottocaso II) X Y * * Si deve eseguire Y X ( X Y ) * * * * 0( X Y ) 2 ( X Y ) * * 1 * * * e il segno è quello di Y . NB: eseguendo ottiene borrow X Y ). * * 4 X Y * * si (perché Conclusione per il caso b): Se X e Y hanno segno discorde, si esegue sempre X Y (modulo del primo * * modulo del secondo). Se non c’è prestito, il risultato è corretto e il segno è quello del primo (cioè di X: z0 x0 ). 5 Se c’è occorre prestito (borrow) calcolare il complemento a 2 del risultato e il segno è l’opposto di quello del primo (cioè z0 x 0 ). Esempi: a) x 710 101112 e y 510 001012 6 -7 +5 -2 0111 0101 = 0010 Non c’è borrow: il risultato è corretto e il segno è quello del primo addendo. Risultato: z = 10010 7 b) x 510 001012 e y 710 101112 +5 -7 -2 0101 0111 = 1110 Si è verificato borrow: occorre complementare a 2 il risultato (0010), e il segno è l’opposto del segno del primo addendo. Risultato: z = 10010 8 In entrambi i casi: segni discordi, non si overflow. 9 ha mai SOMMA IN COMPLEMENTO A 2 Considerazioni preliminari: 1) Poiché 2 n e 0 sono n congruenti modulo 2 , 2 X e 0 X n forniscono lo stesso risultato (a meno di un prestito finale, nel secondo caso). 10 2) Sulla rappresentazione: a) A 0 Il numero è espresso come 0 2 A , dove A 1 0 * * NB: Il numero ha un bit nella parte intera: 0.a1a 2 a 3 ...a n1 11 b) A < 0 È rappresentato complemento come a 2 del corrispondente positivo: 2 A 1 * * (dove A è il modulo di A). Ora 2 A 2 2 A 1 * 0 0 * 0 Il primo 2 è il bit 1 nel segno, mentre 2 A 0 * è complemento a 2 su n-1 bit. 12 il 13 14 Somma in complemento a 2 Caso a) X 0, Y 0 Segni uguali, positivi: occorre che venga effettuata la somma dei moduli e che il segno sia positivo. Eseguendo la somma aritmetica su tutte le cifre, segno compreso, si ottiene: 15 X 02 X 0 Y 02 Y 0 * * Z X Y 02 X Y 0 * * Quindi correttamente si ottiene la somma dei moduli e il segno positivo. NB: se X Y 1., allora si ha * * overflow: eseguendo la somma si osserva che si “sporca” il bit del segno. 16 Esempio: +9 +4 +13 01001 + 00100 = 01101 Altro esempio (caso di overflow): +9 +8 +17 01001 + 01000 = 10001 Risultato negativo: errore per overflow. 17 Caso b) X 0, Y < 0 Segni discordi: occorre che venga effettuata la differenza dei moduli e che il segno sia quello dell’addendo con modulo maggiore. Eseguendo la somma aritmetica accade proprio questo. 18 Infatti: X 02 X 0 Y 1 2 Y 0 * * Y 0Y , * (dove * * complemento a 2 di Y ) Z X Y 1 2 X Y 0 19 * * Per il modulo: X Y X (0 Y ) * X Y * * * * * come richiesto. Per il segno: X Y , * sottocaso I) * cioè modulo di X maggiore o uguale al modulo di Y. 20 Allora: Y X * * per definizione di complemento a 2. Sommando ad ambo i membri * X si ottiene Y X X X * * * Dalle * “considerazioni preliminari”: X X 1000 . ... * * 21 Pertanto Y X 1 * * Ciò comporta che in Z 1 2 X Y 0 X Y * * * * fornisca un risultato pari a 1.xxx... L’unità si va a sommare a 1 2 , dando così 0 1 2 0 2 1 22 0 Ora 1 2 1 cade fuori dalla rappresentazione, e viene scaricato; 0 2 cade nel bit del segno, e 0 corrisponde al valore atteso (risultato positivo). 23 Conclusioni: se X Y , il * * segno è + (come richiesto) e c’è un riporto (carry) che deve essere scaricato (cade fuori dalla rappresentazione). Esempio: +9 -4 +5 01001 + 11100 = 100101 cade fuori dalla rappresentazione e viene scaricato 24 Sottocaso II) X Y * * Analogamente a prima Y X * * Y X X X 1. * * * * Quindi in Z 1 2 X Y 0 * * l’1 nel bit del segno non viene modificato. 25 Conclusione: il risultato è negativo, come richiesto se X Y . * * Esempio: +4 -9 -5 00100 + 10111 = 11011 26 Caso c) X < 0, Y > 0 Come caso b), scambiando X con Y. Caso d) X < 0, Y < 0 Segni uguali, negativi: occorre che venga effettuata la somma dei moduli e che il segno sia negativo. 27 Eseguendo la somma aritmetica si ottiene: X 1 2 X 0 Y 1 2 Y 0 * * Z X Y 1 2 0 2 X Y 1 dove 1 2 1 0 * cade fuori dalla rappresentazione scaricato. 28 e viene * Per il modulo: dalla definizione di complemento a 2 X Y 0 X 0Y * * * * 0 (X Y ) * * Pertanto, eseguendo la somma aritmetica, si esegue di fatto la somma tra i moduli, e la rappresentazione che ne risulta è quella del complemento a 2. 29 Per il segno: affinché non ci sia overflow, deve essere X Y 1 * * per cui deve anche essere X Y 1 * * Infatti: 0 (X Y ) * * 2 (X Y ) 1. xxx... 1 * se X Y 1 * * 30 * Quindi da X Y ( 1) si * * genera un riporto (nel bit precedente il segno) che va a finire nel bit del segno, “aggiustandolo”. Il risultato è quindi negativo, come richiesto. NB: c’è anche il carry dopo il bit del segno, scaricato. 31 che viene Esempio: -9 -4 -13 10111 + 11100 = 110011 cade fuori dalla rappresentazione e viene scaricato. 32 Altro esempio (caso di overflow): -9 -8 -17 10111 + 11000 = 101111 cade fuori dalla rappresentazione e viene scaricato. Risultato positivo: errore per overflow. 33 Le stesse considerazioni valgono per numeri nella base 10 nella rappresentazione in complemente a 10. Esempi (rappresentazione su 3 cifre): a) +9 +4 +13 009 + 004 = 013 34 b) +9 009 + -4 996 = +5 1005 L’1, cioè il carry, cade fuori dalla rappresentazione e viene scaricato. NB: l’operazione eseguita è 9 + (1000 - 4) = 1000 + (9 - 4) = 1000 + (5) cade fuori dalla rappresentazione, viene scaricato 35 c) -9 991 + +4 004 = -5 995 Il risultato è negativo (segno -), il modulo vale il complemento a 10 di 995. Risultato: -5 NB: l’operazione eseguita è (1000 - 9) + 4 = 1000 + (-9 + 4) = 1000 + (-5) = 995 non c’è riporto. 36 d) -9 -4 -13 991 + 996 = 1987 L’1 cade fuori dalla e viene rappresentazione scaricato. Il risultato della somma, 987, è negativo (segno -); il modulo vale complemento a 10 di 987. Risultato: -13 37 il NB: l’operazione eseguita è (1000 - 9) + (1000 - 4) = 1000 + (1000 - 13) cade fuori dalla rappresentazione, viene scaricato 38