Per poter analizzare nel dettaglio come il Computer esegue queste operazioni elementari, è necessario approfondire l’aritmetica binaria per comprendere come si realizzano le quattro operazioni classiche della matematica quali: somma, sottrazione, moltiplicazione e divisione con i numeri binari con segno, senza segno, in virgola mobile.
Addizione tra numeri binari senza segno
Le regole dell’addizione con numeri binari è sintetizzata nella seguente tabella.
Addizione
Riporto (carry)
0 + 0 = 0
0
1 + 0 = 1
0
0 + 1 = 1
0
1 + 1 = 0
1
Quando sommiamo (1+1) otteniamo 0 e viene generato un riporto pari a 1. In tutti gli altri casi non c’è riporto.
Seguendo questa regola è possibile effettuare una qualsiasi addizione tra numeri binari utilizzando la classica tabella in cui incolloniamo i bit dei due operandi da sommare.
Primo esempio addizioniamo i numeri 5 e 1.
Prima operazione trasformiamo i due numeri decimali in numeri binari usando le regole di conversione viste in precedenza.
Dividendo
Divisore
Quoziente
Resto
510
210
210
12
210
210
110
02
110
12
Risultato:
1012
Dividendo
Divisore
Quoziente
Resto
110
12
Risultato:
12
Una volta calcolato i due valori binari, incolonniamoli per effettuare la somma.
Riporto:
0
1
1
0
1
+
1
=
Risultato:
1
1
0
Per verificare la correttezza dell'operazione, convertiamo il risultato binario in decimale, otterremo:
N = 1 * 22 + 1 * 21 + 0 * 20 = 4 + 2 + 0 = 6
Infatti 5 + 1 = 6.
Secondo esempio addizioniamo i numeri 14 e 3.
Prima operazione trasformiamo i due numeri decimali in numeri binari usando le regole di conversione viste in precedenza.
Dividendo
Divisore
Quoziente
Resto
1410
210
710
02
710
210
310
12
310
210
110
12
110
12
Risultato:
11102
Dividendo
Divisore
Quoziente
Resto
310
210
110
12
110
12
Risultato:
112
Riporto:
1
1
1
0
1
1
1
0
+
1
1
=
Risultato:
1
0
0
0
1
Convertiamo il risultato binario in decimale, otterremo:
N = 1 * 24 + 0 * 23 + 0 * 22 + 0 * 21 + 1 * 20 = 16 + 0 + 0 + 0 + 1= 17
Infatti 14 + 3 = 17.
Possiamo notare che nel secondo esempio per poter rappresentare il risultato della somma realizzata, è necessario un ulteriore bit rispetto alla dimensione massima dei due numeri binari di partenza. Questo a causa dell’ultimo riporto.
Questa osservazione ci aiuta a capire che un processore, pur potendo effettuare le somme correttamente, avrà un limite di rappresentazione fissato sul numero massimo di bit utilizzabili.
I processori elaborano 8, 16, 32 fino, attualmente, a 64bit oltre il quale un numero non è rappresentabile.
Terzo esempio immaginiamo di avere addendi in binario di lunghezza pari a 8 bit; 23210 (111010002) e 8610 (011011102).
Riporto:
1
1
1
0
1
0
0
0
1
1
1
0
1
0
0
0
+
0
1
1
0
1
1
1
0
=
Risultato:
-
0
1
0
1
0
1
1
0
Poichè abbiamo a disposizione solo 8 bit, il nono bit (quello più significativo) generato dal riporto, non verrebbe utilizzato. Se andiamo a calcolare il decimale del numero ottenuto, avremo il valore 8610 mentre il valore atteso era 3422.
Si noti che in corrispondenza del nono bit nella forma di conversion da binario a decimale, avremmo avuto 1 * 29 = 25610 che sommato a 8610 avrebbe dato proprio 34210 il valore che stavamo cercando di calcolare.
Il processore, quando non può rappresentare un numero per via della lunghezza ridotta del numero di bit, lancia un warning detto overflow che segnala il risultato non corretto in quanto eccede la capacità di rappresentazione di quel processore. L’overflow è segnalato proprio grazie all’ultimo bit di riporto che eccede il limite massimo. Quel bit è l’ultimo carry (bit di riporto) che come vedremo più tardi sarà memorizzato in un apposito registro del processore.
Esercizio 1 eseguire le seguenti somme utilizzando massimo 8 bit ed evidenziando eventuali overflow: 8+6, 21+10, 17+19, 61+75, 124+208
Sottrazione tra numeri binari senza segno
Nella sottrazione tra numeri binari senza segno non si considera il riporto ma il prestito (barrow).
Cambiano inoltre le regole delle operazioni elementari tra bit in base alla seguente tabella.
Sottrazione
Prestito
0 - 0 = 0
0
1 - 0 = 1
0
0 - 1 = 1
1
1 - 1 = 0
0
La particolarità, in questo caso, è che quando proviamo ad effettuare l’operazione 0 – 1 il risultato sarà 1 ma verrà chiesto in prestito un bit, che varrà 1.
Primo esempio sottraiamo i due numeri 5 (1012) e 3 (112).
Incolonniamo i due numeri per effettuare la sottrazione (prevedendo una riga per il prestito).
1
0
1
-
Prestito:
0
1
1
1
=
Risultato:
0
1
0
La prima operazione è 1 – 1 = 0. Non abbiamo necessità di alcun prestito.
La seconda operazione è invece 0 – 1 = 1, in cui abbiamo preso un prestito dal successivo bit.
La terza operazione è 0 – 0 in quanto il bit precedentemente pari a 1 è stato prestato nell’operazione precedente e quindi attualmente vale 0. L’ultima operazione vale dunque 0.
Il risultato sarà 010 che vale 210 che è il risultato che ci attendevamo.
In questo esempio, si noti, che alla seconda operazione abbiamo trovato subito un prestito dal bit subito successivo. Quando questo non accade, si scorrono tutti i bit successivi fino a trovare il valore 1. A quel punto si pone a zero quest’ultimo e si invertono tutti quelli precedenti (che erano a 0) a 1.
Secondo esempio sottraiamo 146 (100100102) e 127 (11111112).
1
1
1
1
1
1
1
0
-
Prestito:
0
0
1
0
0
1
1
1
1
1
1
1
1
=
Risultato:
0
0
1
0
0
1
1
Il risultato finale è 100112 che è pari a 1910, infatti 146 – 127 = 19.
Esercizio 2 eseguire le seguenti sottrazioni: 15-4, 10-7, 32-15
Anche nella sottrazione si può verificare un overflow causato dall’ultimo prestito. Il processore gestisce i prestiti come se fossero carry e quindi usando lo stesso registro.
Ad esempio la sottrazione tra 10410 e 12210 da un overflow.
Esercizio 3 eseguire la sottrazione 104-122 segnalandone onato2000un eventuale overflow
Prodotto tra numeri binari senza segno
Il prodotto tra numeri binari è identico al prodotto tra decimali.
Le operazioni elementari tra binari è la seguente:
Moltiplicazione
0 * 0 = 0
1 * 0 = 0
0 * 1 = 0
1 * 1 = 1
Esempio moltiplichiamo 1010 (10112) e 1110 (10102).
b6
b5
b4
b3
b2
b1
b0
1
0
1
1
x
1
0
1
0
=
0
0
0
0
+
1
0
1
1
-
0
0
0
0
-
-
1
0
1
1
-
-
-
1
1
0
1
1
1
0
Il risultato del prodotto è 1101110 pari cioè a 11010.
Esercizio 4 eseguire le seguenti moltiplicazioni usando al più 8 bit: 8x3, 6x5, 15x12 e 18x20
Operazione di shift per casi particolari di moltiplicazione tra binari senza segno e potenze di due.
Esistono casi particolari di prodotto tra due numeri binari senza segno che è possibile risolvere con l’operazione di shift.
Moltiplicazione per due
Per risolvere il prodotto di un qualsiasi numero per due, è sufficiente aggiungere uno 0 come bit meno significativo al numero stesso (shiftando i restanti bit del numero a sinistra).
Vale la stessa regola anche per la moltiplicazione per 4 solo che stavolta si aggiungono due bit pari a 0 a destra del numero come bit meno significativi.
La regola può essere generalizzata al prodotto di numeri per una potenza di due.
In questo caso si effettua uno shift a sinistra di n posizioni e si aggiungono n zeri come bit meno significativi.
Divisione tra numeri binari senza segno
Anche nella divisione tra numeri binari, la regola è identica alla divisione tra decimali.
Divideremo un dividendo per un divisore ottenendo un quoziente ed un resto.
Esempio effettuiamo la divisione tra 5410 : 510.
In binario avremo 1101102 : 1012
b5
b4
b3
b2
b1
b0
1
1
0
1
1
0
:
1
0
1
=
1
0
1
0
1
0
1
0
0
1
1
-
-
1
1
1
-
1
0
1
0
1
0
0
Il risultato della divisione sarà costituito dalla parte quoziente pari a 10102 = 1010 con resto pari a 1002 = 410.
Esercizio 5 eseguire le seguenti divisioni: 16:8, 23:5, 60:4
Operazione di shift per casi particolari di divisione tra binari senza segno e potenze di due.
Divisione per due
Per risolvere la divisione tra un numero e due, è sufficiente togliere il bit meno significativo (shift a destra). Nel caso in cui il bit meno significativo è pari a 1, allora il resto è pari ad 1, diversamente è pari a zero.
Divisione per quattro
La regola è la stessa anche divendo per quattro. Ciò che cambia è che stavolta ad essere rimossi sono i due bit meno significativi. Nel caso entrambi siano uguali a zero, allora la divisione non ha resto, diversamente il resto sarà proprio pari ai due bit rimossi.
Divisione per potenza di due
La regola può essere generalizzata alla divisione tra numeri per una potenza di due.
In questo caso si effettua uno shift a destra di n posizioni e si rimuovono gli n bit meno significativi. Se tali bit sono tutti uguale a zero allora il resto sarà zero, diversamente se almeno uno dei bit è 1, allora l’insieme dei bit sarà il resto diverso da zero.
Complemento a 1
Un’altra operazione importante nel sistema binario è il complemento.
In particolare il complemento a 1 (CA1) si ottiene invertendo ogni bit con il suo complementare. esempio CA1(011110) = 100001
Complemento a 2
Il complemento a 2 (CA1), invece, è il complemento a 1 al cui risultato viene aggiunto il valore uno.
Esiste un’ulteriore tecnica per ottenere il complemento a 2 di un numero che consiste nel individuare il primo bit pari a 1 partendo dal bit meno significativo verso il bit più significativo.
Una volta individuato, dal bit successivo invertire tutti i bit.
Esempio
CA1 (10010010) -> 10010010 -> 01101110.
Aiutati nelle conversioni e le operazione in binario con l'applicazione InformaticaXTutti
Cosa abbiamo imparato da questa lezione
Conoscenze
Quali sono i passi da seguire per effettuare le operazioni elementari tra numeri binari senza segno
Quali sono i passi da seguire per effettuare le operazioni di complemento a 1 e complemento a 2
Cosa si intende per overflow
Abilità
Siamo in grado di scandire i passi per effettuare le operazioni elementari tra numeri binari senza segno, complemento a 1 e complemento a 2
Competenze
Siamo in grado di effettuare le operazioni algebriche su tra qualsiasi coppia di numeri binari
Siamo in grado di determinare se una operazione albgebrica tra numeri binari restituisce un numero binario rappresentabile dato un tot di bit