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:
|
|
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] |