Assembly/Rappresentazione dati/Operazioni aritmetiche

Indice del libro

Come nel sistema decimale, anche nei sistemi binario ed esadecimale, possiamo svolgere le 4 operazioni aritmetiche di base. Non occorre essere esperti in queste operazioni, basta saperle usare in caso di necessità. Ad ogni modo esiste la calcolatrice predefinita di gNewSense o la calcolatrice di Windows, che impostata in modalità scientifica, ci permetterà di scegliere la base del sistema scelto ed effettuare le operazioni semplicemente.

Addizione binariaModifica

Quanto fa 11001010b + 01011000b?
Come nel sistema decimale, l'operazione si svolge così:

  1 1 0 0 1 0 1 0 +
  0 1 0 1 1 0 0 0 =
  ---------------
1 0 0 1 0 0 0 1 0

Partendo da destra si sommano i primi due numeri. Se come risultato danno 0, si lascia uno 0. Se come risultato danno 1, resta ancora 1, ma se invece danno come risultato 2, che nel sistema binario non esiste (al limite esiste 10b), il risultato sarà 0, con riporto 1. Semplice no?

Sottrazione binariaModifica

Come per l'addizione, anche la sottrazione si svolge allo stesso modo.

1 1 0 0 1 0 1 0 -
0 1 0 1 1 0 0 0 =
---------------
0 1 1 1 0 0 1 0

Partendo da destra si esegue la differenza dei primi due numeri. Se la sottrazione è 0 - 0, si scrive 0, se invece è 1 - 0, si lascia ancora 1, se ancora, 1 - 1, si scrive 0. Altrimenti nel caso di 0 - 1, si chiede prestito alla cifra a sinistra. Proprio come nella sottrazione decimale.

ATTENZIONE: prima di eseguire una sottrazione controllare che il primo membro della sottrazione sia maggiore del secondo.


Esiste tuttavia un metodo semplificato, ed è attualmente il metodo usato dalle ALU dei microprocessori in quanto è più facile da implementare e supporta nativamente il calcolo con interi negativi.

Prima di spiegarlo è utile soffermarsi su una seguente considerazione: Dato un numero x (mettiamo 15) chiameremo "complemento in base 10 di x" la differenza tra la potenza di 10 appena più grande di x (cioè 100) e x, ovvero 100 - 15 = 85. Supponiamo di dover effettuare la differenza tra 74 e 15 (= 59). Anziché effettuare la sottrazione, aggiungiamo a 74 il complemento calcolato poco prima: 74 + 85 (= 159). A questo punto si sottrae al risultato la potenza di 10 all'inizio: 159 - 100 = 59. Si è quindi ottenuto lo stesso risultato che si sarebbe ottenuto con la sottrazione classica.

La dimostrazione algebrica è molto semplice:

Siano dati due numeri  . Sia   la base del sistema di numerazione considerato, e sia   il primo numero  .

Si calcoli il complemento di  :  .

Perciò:  

Ci si potrebbe chiedere perché sfruttare il discorso del complemento per la sottrazione, data la apparente difficoltà del calcolo del complemento. La risposta è che, nonostante le apparenze, il metodo del complemento è più semplice.

Supponiamo ancora di voler calcolare 74 (01001010) - 15 (00001111)

Calcolare il complemento, stavolta a 2, di 15 è semplicissima e si può calcolare in vari modi, qui mostriamo il più semplice (che è anche il più veloce).

Il complemento di un numero in base due diventa semplice non appena ci si accorge che per ottenere la potenza successiva basta aggiungere uno zero a destra. Ovvero: un 1 e poi il numero 15 in binario:

0 0 0 0 0 0 0 1
0 0 0 0 1 1 1 1

Dato che il primo numero è più piccolo del secondo basta aggiungere tanti zeri quanti bastano per superare 15:

0 0 0 1 0 0 0 0
0 0 0 0 1 1 1 1

Una volta trovata la potenza si dovrebbe fare la differenza col classico metodo: 00010000 - 00001111 (= 00000001). Ma noi non faremo così. In realtà il calcolo è molto più semplice quando ci si accorge che in realtà lo stesso risultato si ottiene invertendo ogni cifra del secondo numero (cioè passare da 0 a 1 e viceversa) a partire dal primo 1, e aggiungere 1:

0000 1111 -> 1111 0000 -> 1111 0001

Non ci si preoccupi del fatto che ci sono tutti quegli 1, saranno utili dopo.

Come ulteriore esempio mostriamo il complemento di 178 (10110010):

1011 0010 -> 0100 1101 -> 0100 1110 256 - 178 = 78 (0100 1110).

Ritornando al calcolo originale, 74 - 15, facciamo 74 + compl2(15):

0 0 1 0 0 1 0 1 0 +
0 1 1 1 1 0 0 0 1 =
1 0 0 1 1 1 0 1 1

Si scartino le ultime due cifre del risultato e si ottiene: 0011 1011 = 59. Quindi si è ottenuto lo stesso risultato.


Sommarizzando:

  1. Prendere il sottraendo.
  2. Invertire tutte le sue cifre e aggiungere 1
  3. Sommare il minuendo al complemento appena calcolato
  4. Togliere le due cifre più significative se si sa che il risultato è positivo, altrimenti no

Altri due esempi: 110 - 22 = 88

0110 1110 - 0001 0110 ->

0110 1110 +
1110 1010 =
---------

11101 1000 -> XX101 1000 (88)


22 - 100 = -88

0001 0110 - 0110 1110 ->

0001 0110 - 1001 0010 =


1010 1000 (sarebbe 328, ma dato che il bit più significativo è impostato a 1 allora il numero è negativo. Calcolo del complemento del risultato)

1010 1000 -> 0101 1000 (88). Ergo, 1010 1000 è uguale a -88

Moltiplicazione binariaModifica

Anche la moltiplicazione non presenta grandi difficoltà:

              1 1 0 0 1 0 1 0 *
              0 1 0 1 1 0 0 0 =
              ---------------
              0 0 0 0 0 0 0 0
            0 0 0 0 0 0 0 0 /
          0 0 0 0 0 0 0 0 /
        1 1 0 0 1 0 1 0 /
      1 1 0 0 1 0 1 0 /
    0 0 0 0 0 0 0 0 /
  1 1 0 0 1 0 1 0 /
0 0 0 0 0 0 0 0 /
-----------------------------
1 0 0 0 1 0 1 0 1 1 1 0 0 0 0

Si moltiplica per ogni termine del moltiplicatore, a partire da destra, tutti i termini del moltiplicando, spostando per ciascun termine del primo di una cifra a sinistra. Alla fine si sommano i risultati.

Divisione binariaModifica

Questa è la più difficile delle operazioni binarie. Per prima cosa, bisogna capire, che in binario, non esistono cifre dopo la virgola. Quindi deve essere sempre una divisione esatta.

Si procede in questo modo:

  • Si convertono i valori in decimale.
  • Si esegue la divisione decimale.
  • Si trasforma il risultato in binario.

In alternativa si può procedere col "vero e proprio" metodo, più complicato

Si provi a dividere 93 per 13. Trascriviamoli in binario, togliendo gli zeri più a sinistra:

101 1101
    1101
1011101 | 1101
        | -----

Si procede così: si prendono tante cifre del dividendo a partire da sinistra quante sono quelle del divisore (4). Si scrivano sotto quelle cifre il divisore. Se il divisore è più grande di quelle quattro cifre si scrive uno 0 nel quoto e si fa scendere un'altra cifra, altrimenti, come si farebbe per una normale divisione decimale, si faccia la sottrazione. Poi, si fa scendere una cifra e così via:

 1011101 | 1101
         | -----
 10111   | 0111
- 1101   |
  10100  |
 - 1101  |
    1111 |
  - 1101 |
      10 

Si è ottenuto 111 (7) di quoto e 10 (2) di resto. Infatti 93/13 = 7; 13 * 7 = 91; 91 + 2 = 93

Addizione esadecimaleModifica

Su questo tipo di addizione, dovremo farci un po' l'abitudine. Quanto fa:

9h +
1h =

La vostra risposta sarà immediatamente 10h. Sbagliato!!! Ricordate che in esadecimale, si contà in questo modo:
0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 ecc...
Quindi quando si addizionano 9h e 1h il risultato sarà 0Ah.

Sottrazione esadecimaleModifica

Lo stesso problema lo abbiamo qui:

10h -
 1h =

9h? Sbagliato. 10h - 1h da come risultato 0Fh. Questi sono gli errori più facili da commettere quando si eseguono addizioni e moltiplicazioni esadecimali.

Moltiplicazione esadecimaleModifica

Ovviamente il metodo sarebbe quello delle operazioni in binario e decimale, ma in questo caso, dovrete imparare le tabelline della A, della B della C ecc...
Alquanto sconveniente.... La cosa migliore in questo caso è avere una calcolatrice a portata di mano. Così come per la divisione.

  Modulo precedente

Struttura Binaria e organizzazione dati

  Torna a

Assembly

  Modulo successivo

Operazioni logiche con bit e bytes