ADDIZIONE E SOTTRAZIONE BINARIA 
ESERCIZIO 1.2.1 - ADDIZIONI E DIFFERENZE

Effettuare le seguenti operazioni in binario puro:

Metodo: Come nelle usuali operazioni su numeri decimali, si può avere un riporto sul bit di peso immediatamente superiore, o un prestito dal bit di peso immediatamente superiore. Nella numerazione binaria questi sono detti rispettivamente carry (riporto) e borrow (prestito). Le somme/differenze bit a bit possono essere definite come segue:

0 + 0 = 0  
1 + 0 = 1  
0 + 1 = 1  
1 + 1 = 0 1 carry
 
0 - 0 = 0  
1 - 0 = 1  
0 - 1 = 1 1 borrow
1 - 1 = 0  

Esempio: svolgere la seguente sottrazione binaria: 1012-1112 (in decimale 5-7).

  0 1 0 1 -
  0 1 1 1 =

        0  

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

      1 0  

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

  1 1 1 0  

1 ->
borrow
1 1 +1 1+1 1 -
  0 1 1 1 =

  1 1 1 0  

1) (100010)2 +(1001101)2 (34)10 + (77)10 [R. 1101111]
2) (11100001)2 +(111111)2 (225)10+ (63)10 [R. 100100000]
3) (11100101)2 +(1101111)2 (229)10+ (111)10 [R. 101010100]
4) (1010)2 - (110)2 (10)10- (6)10 [R. 100]
5) (100111)2 - (1110)2 (39)10- (14)10 [R. 11001]
6) (100000)2 - (111)2 (32)10- (7)10 [R. 11001]
7) (1010100)2 - (100101)2 (84)10- (37)10 [R. 101111]
8) (10010)2 - (111)2 (18)10- (7)10 [R. 1011]
9) (10010)2 - (1111)2 (25)10- (15)10 [R. 1010]
 
ESERCIZIO 1.2.2 - RAPPRESENTAZIONE NUMERI CON SEGNO CON N BIT

La rappresentazione in modulo e segno costituisce uno dei modi per rappresentare numeri interi relativi (con segno) su un numero fissato di bit. Dati N bit, il bit più significativo indica il segno, i restanti N-1 il valore assoluto del numero, espresso in binario puro.

1° bit N-1 bit
Segno:
0 per i positivi,
1 per i negativi
Valore assoluto del numero

Esempio: rappresentare il numero -7 in modulo e segno su 8 bit : 7 => 0000 0111 => -7 =1000 0111

Questo tipo di rappresentazione dei numeri con segno implica:
- abbiamo due rappresentazioni dello 0 (ad esempio con 8 bit => 10000000 [-0] e 00000000 [+0])
- l'intervallo dei valori ammessi è [-2N-1+1;2N-1-1] - esempio 8 bit =>[-27+1;+27-1] => [-127,127]
- algoritmi aritmetici più complessi
- metodologia simile alla nostra usuale rappresentazione
- è inadatta all'architettura dei calcolatori per cui è necessario utilizzare altre rappresentazioni.

Rappresentare in modulo e segno su 8 bit i seguenti numeri decimali:

1) 12   [R. 00001100]
2) -35   [R. 10100011]
3) +40   [R. 00101000]
4) -1   [R. 10000001]
5) -128   [R. Impossibile]
6) +271   [R. Impossibile]
7) 127   [R. 01111111]

La rappresentazione in complemento a 1 costituisce il secondo dei modi analizzati per rappresentare i numeri interi relativi (con segno) su un numero fissato di bit.
Dati N bit, usiamo il primo bit a sinistra (più significativo) per il segno (1 indica un numero negativo). I restanti N-1 bit contengono:
- per i numeri positivi il numero espresso in binario puro;
- per i negativi il complemento bit a bit (inverto 0 con 1 e viceversa) della rappresentazione binaria pura del valore assoluto.

1° bit N-1 bit
Segno:
0 per i positivi,
1 per i negativi
Valore assoluto del numero per i positivi - complemento bit a bit (inverto 0 con 1 e viceversa) per i negativi

Esempio: rappresentare il numero -7 in complemento a 1 su 8 bit : 7 => 0000 0111 => -7 =1111 1000

Questo tipo di rappresentazione dei numeri con segno implica:
- abbiamo due rappresentazioni dello 0 (ad esempio con 8 bit => 11111111 [-0] e 00000000 [+0])
- i coefficienti della rappresentazione cN-1cN-2...c1c0 hanno come pesi

             cN-1*(-2N-1+1)+cN-2*(2N-2) + ... +c1*21+c0*20

- l'intervallo dei valori ammessi è la stessa della precedente rappresentazione ovvero [-2N-1+1;2N-1-1]
  esempio 8 bit =>[-27+1;+27-1] => [-127,127]
- algoritmi aritmetici meno complessi: infatti posso usare la somma bit a bit anche se devo aggiungere sempre 1 al risultato ottenuto. Supponiamo di dover calcolare questa differenza: 7 - 5. Utilizzando la notazione in complemento a 1 su 8 bit avrò:
7=0000 0111 e -5=1111 1010 (infatti 5 = 0000 0101). Se sommo bit a bit ottengo:

0000 0111 +
1111 1010 =
--------------
0000 0001 +
0000 0001 =  (correzione)
--------------
0000 0010  => 2 in decimale
 

Supponiamo di dover calcolare questa differenza: 7 - 7. Utilizzando la notazione in complemento a 1 su 8 bit avrò:
7=0000 0111 e -7=1111 1000. Se sommo bit a bit ottengo:

0000 0111 +
1111 1000 =
--------------
1111 1111 +
0000 0001 =  (correzione - non necessaria poiché 1111 1111 è 0 in complemento a 1) 
--------------
0000 0000 => 0

- metodo di rappresentazione differente dalla usuale notazione in base B
- non è completamente  adatta all'architettura dei calcolatori

Rappresentare in complemento a 1 su 8 bit i seguenti numeri decimali:

1) 12   [R. 00001100]
2) -35   [R. 11011100]
3) +40   [R. 00101000]
4) -1   [R. 11111110]
5) -128   [R. 10000000]
6) +271   [R. Impossibile]
7) 127   [R. 01111111]

La rappresentazione in complemento a 2 si basa su questa definizione generale:
dato un numero
X rappresentato con N cifre in base B si definisce come suo complemento alla base la quantità BN-X.
Esempi:
1) se N=2 e B=10 il complemento alla base di 36 è 64 (102 - 36 = 100 - 36 = 64)
2) se N=8 e B=2 il complemento alla base di 7 (0000 0111) è 1111 1001 [28 - 7  in binario è 1 0000 0000 - 0000 0111 = (1 + 1111 1111 - 0000 0111)= 1 + 1111 1000]

La modalità operativa per ottenere questa rappresentazione è la seguente: sommo 1 (solo sui numeri negativi) alla rappresentazione in complemento a 1. Per i positivi il complemento resta la notazione binaria pura.

Esempio: rappresentare il numero -7 in complemento a 2 su 8 bit : 7 => 0000 0111 => -7C1 =1111 1000 => -7C2 =1111 1001

E' possibile ottenere la rappresentazione in complemento a 2 con N bit anche utilizzando questa metodologia alternativa:
a) calcolo la rappresentazione binaria pura del valore assoluto
b) partendo da destra lascio invariati tutti i bit fino al primo 1 compreso
c) complemento bit a bit i restanti.

Esempio: rappresentare il numero -7 in complemento a 2 su 8 bit : 6 => 0000 0110 => -7C2 =1111 1010

Questo tipo di rappresentazione dei numeri con segno implica:
- abbiamo una sola rappresentazione dello 0 (ad esempio con 8 bit => 11111111C1 +1 [-0] => 00000000C2 e 00000000 [+0])
- l'intervallo dei valori ammessi è [-2N-1;2N-1-1] - esempio 8 bit =>[-27;+27-1] => [-128,127]
- i coefficienti della rappresentazione cN-1cN-2...c1c0 hanno come pesi

 cN-1*(-2N-1)+cN-2*(2N-2) + ... +c1*21+c0*20

- algoritmi per il calcolo aritmetico estremamente semplici: infatti posso usare la somma bit a bit anche in presenza di differenze e questo funziona sempre!

Esempio: supponiamo di dover calcolare questa differenza: 6 - 5. Utilizzando la notazione in complemento a 2 su 8 bit avrò:
6=0000 0110 e -5=1111 1011 (infatti 5 = 0000 0101 => 1111 1010C1 => 1111 1011C2). Se sommo bit a bit ottengo:

0000 0110 +
1111 1011 =
--------------
0000 0001

- metodo di rappresentazione differente dalla usuale notazione in base B
- consente di semplificare l'architettura dei calcolatori

Rappresentare in complemento a 2 su 8 bit i seguenti numeri decimali:

1) 12   [R. 00001100]
2) -35   [R. 11011101]
3) +40   [R. 00101000]
4) -1   [R. 11111111]
5) -128   [R. 10000000]
6) +271 0 [R. Impossibile]
7) 127   [R. 01111111]

ESERCIZIO 1.2.3 - SOMMA E DIFFERENZA IN COMPLEMENTO A DUE

Eseguire le seguenti operazioni in complemento a due su 9 bit:

Metodo: Dati due numeri X e Y in complemento a due su N bit, la somma X + Y si calcola sommando aritmeticamente tutti i bit dei due addendi, compreso quello di segno. L'eventuale carry oltre il bit di segno viene tralasciato. Per quanto riguarda la differenza è simile alla somma: basta trasformarla in somma tra il primo numero e il negativo del secondo. Esempio (7)10 - (4)10 diventa (7)10 + (-4)10.

Considerando che la differenza è riconducibile ad una somma si verifica un overflow se:
- i due addendi hanno segno concorde
- il risultato ha segno opposto ai due addendi

esempio: calcolare la differenza: (-12)10 + (-6)10 in complemento a due su 5 bit. Utilizzando la notazione in complemento a 2 su 8 bit avrò:  (-12)10 =10100 [infatti 12 = 01100 => 10011C1+1 => 10100C2] e (-6)10=11010 [infatti 6 = 00110 => 11001C1+1 => 11010C2]. Sommando bit a bit ottengo:

 1 0100 +
 1 1010 =
--------------
101110

1) (131)10 - (193)10 R. (-62)10 = 111000010
2) (255)10 - (256)10 R. (-1)10 = 111111111
3) (-127)10 + (-130)10 R. (-257)10 overflow
4) (255)10 + (2)10 + (-127)10 R. (130)10 = 010000010
5) (-256)10 + (2)10 R. (-254)10 = 100000010

ESERCIZIO 1.2.4 - CONVERSIONE NUMERI FRAZIONARI

Rappresentare in formato IEEE P754 i seguenti numeri:

1) (5,0)10 [R. 0 10000001 0100 ... 0]
2) (-9,25)10 [R. 1 10000010 0010100 ... 0]
3) (12,8125)10 [R. 0 10000010 100110100 ... 0]
4) Eseguendo il DUMP (in esadecimale) di un file contenente numeri nella rappresentazione floating-point standard, si leggono i seguenti numeri: 41440000 3E800000 Di quali numeri si tratta? [R. 12,25 - 0,25]

 

Dati i seguenti numeri in formato IEEE P754, dire a quale numero decimale corrispondono:

Metodo

1) 0 10000001 010010 ... 0 [R. 5.125]
2) 1 10001101 01110 ... 0 [R. 23552.0]
3) 0 01111101 01010 ... 0 [R. 0.328125]

ESERCIZIO 1.2.5 - CONVERSIONE BCD (Binary Coded Decimal)

Metodo: Utilizzo la seguente tabella di corrispondenza

0 1 2 3 4 5 6 7 8 9
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001

Convertire i seguenti numeri binari in BCD:

1) 1000 1001 0011 0111   [R. 8937]
2) 100 1000 0010 1001   [R. 4829]
3) 1 0010 0011 0010 1001 0001   [R. 123291]
4) 10 1001 0101 0110 0101   [R. 29565]

Convertire i seguenti numeri BCD in binario:

1) 4171   [R. 100 0001 0111 0001]
2) 6153   [R. 110 0001 0101 0011]
3) 4261   [R. 100 0010 0110 0001]
4) 10478   [R. 1 0000 0100 0111 1000]