L’insieme dei numeri interi è un insieme infinito; i numeri interi si possono rappresentare su una retta.
I numeri interi rappresentabili in memoria sono solo un sottoinsieme finito dei numeri interi; l’intervallo di valori utilizzabili dipende dal numero di bit usati per la memorizzazione.
Se per la rappresentazione dei numeri si usano n
bit, i possibili valori sono 2n - 1
; metà di questi valori vengono usati per rappresentare numeri positivi e metà per rappresentare numeri negativi.
Il metodo più utilizzato per rappresentare i numeri interi in n
bit è quello del complemento alla base.
Complemento alla base
Si definisce complemento alla base di un numero intero A
in base b
, rappresentato con n
cifre, il numero bn - A
.
Tale valore (A
) può essere calcolato più semplicemente facendo il complemento a b-1 di ciascuna cifra, tranne che per l’ultima cifra significativa a destra per la quale si fa il complemento a b.
Quindi per esempio nel sistema di numerazione binario, considerando 16 cifre, il complemento alla base di A è 216 – A; il complemento di un numero si può calcolare semplicemente in questo modo: si parte da destra e si lasciano invariati gli zeri fino al primo 1, il primo 1 resta invariato, tutte le cifre successive vanno invertite, cioè gli 0 diventano 1 e gli 1 diventano 0.
A = 1100110100
In base 2 considerando 16 cifre A = 216 – A cioè 10000000000000000 - 1100110100
che si può calcolare come:
1 1 1 1 1 1 1 1 1 1 1 1 1 10 0 0 - 1 1 0 0 1 1 0 1 0 0 = ________________________________ 1 1 1 1 1 1 0 0 1 1 0 0 1 1 0 0
Sottrazione con il metodo del complemento alla base
La definizione di complemento alla base è utile perché permette di ricondurre sempre le sottrazioni ad addizioni.
Infatti si può osservare che vale la seguente uguaglianza
B - A = B + (bn - A) - bn = B + A - bn
e quindi la sottrazione B – A può essere eseguita sommando a B il complemento di A, trascurando poi il riporto che viene generato nella posizione n+1; dato che si utilizzano n cifre per la rappresentazione, il riporto nella posizione n+1 viene eliminato automaticamente.
In base 2 considerando 16 cifre:
B - A = 10111010 - 110010
0000000010111010 +
1111111111001110 = A
_________________
10000000010001000 -
10000000000000000 = 216 (cioè il riporto da trascurare)
_________________
10001000
Rappresentazione dei numeri interi in n bit
I numeri positivi vengono rappresentati semplicemente con il loro valore binario; i numeri negativi vengono rappresentati in complemento alla base.
Con n
bit i numeri rappresentabili sono quelli dell’intervallo tra -2n-1 e 2n-1 – 1.
Per la rappresentazione di numeri interi di solito vengono usati:
-
8 bit (numeri tra -128 e 127),
-
16 bit (numeri tra -32768 e 32767),
-
32 bit (valori tra -2.147.483.648 e 2.147.483.647),
-
64 bit (valori tra -9.223.372.036.854.775.808 e 9.223.372.036.854.775.807)
Con 16 bit
Si possono rappresentare 65.535 valori nell’intervallo tra -32.768 e 32.767.
Il numero positivo più grande è rappresentato da 0111111111111111
, cioè 32.767 (215 – 1).
Il numero negativo più piccolo è rappresentato da 1000000000000000
, cioè 32.768 (facendo il complemento alla base si ottiene ancora 1000000000000000
, cioè 215).
La rappresentazione di 44 è 0000000000101100
.
Infatti
44:2 = 22 con resto 0 22:2 = 11 con resto 0 11:2 = 5 con resto 1 5:2 = 2 con resto 1 2:2 = 1 con resto 0 1:2 = 0 con resto 1
la rappresentazione va completata con zeri fino ad arrivare a 16 cifre.
La rappresentazione di -44 è 1111111111010100
.
Infatti basta fare il complemento a 2 di 0000000000101100
.
Data la rappresentazione di un numero si può risalire al numero rappresentato in questo modo:
-
tutti i valori che iniziano con 0 rappresentano numeri positivi; basta quindi operare la conversione in decimale;
-
tutti i valori che iniziano con 1 rappresentano numeri negativi e sono quindi in complemento alla base; per stabilire il valore assoluto del numero rappresentato bisogna calcolare il complemento alla base (il complemento del complemento restituisce il valore originale) e poi operare la conversione.
Data la rappresentazione in 16 bit
1111111111111110
dato che inizia con 1 è la rappresentazione di un numero negativo.
Facendo il complemento alla base si ottiene il valore assoluto
0000000000000010
cioè 2.
Quindi 1111111111111110
è la rappresentazione di -2.
Utilizzando la rappresentazione in complemento alla base, tutte le operazioni aritmetiche di addizione e sottrazione tra numeri interi sono ricondotte ad operazioni di addizione.
Bisogna ricordare che per eseguire la sottrazione A - B
tra numeri rappresentati in n
bit si può sommare ad A
il complemento alla base di B
, togliendo poi 2n
.
L’operazione 15 – 10 può essere eseguita nel modo seguente
0000000000001111 + 1111111111110110 = (complemento alla base di 10) ________________ 1|0000000000000101
L’operazione 7 – 10 dà un risultato negativo e quindi espresso in forma complementata.
0000000000000111 + 1111111111110110 = (complemento alla base di 10) ________________ 1111111111111101 rappresentazione in complemento alla base del risultato
Errori dovuti alla rappresentazione finita
Il fatto che si possa usare solo un intervallo finito di numeri interi causa alcuni problemi.
Se si cerca di inserire in una variabile intera un valore non compreso nell’intervallo ammesso dal tipo della variabile si verifica un errore di esecuzione.
Invece durante l’esecuzione di operazioni sui numeri interi si possono ottenere risultati un po’ strani; per esempio la somma di due numeri positivi può produrre un numero negativo o viceversa.
Questo è dovuto al fatto che i risultati delle operazioni in un intervallo finito si basano sull’aritmetica modulare; l’aritmetica modulare considera un intervallo di valori e li rappresenta su una circonferenza; partendo dallo 0 i numeri positivi possono essere elencati in senso orario e quelli negativi in senso antiorario; per sommare 1 ci si sposta lungo la circonferenza di una posizione in senso orario e per sottrarre 1 ci si sposta in senso antiorario; il numero positivo più grande e il numero negativo più piccolo si trovano vicini e quindi sommando 1 al numero positivo e passando al valore successivo in senso orario si ottiene proprio il numero negativo più piccolo.
Dalla somma 32.767 + 6 ci si aspetterebbe come risultato 32.773.
Invece si ha
0111111111111111 + 0000000000000110 = ________________ 1000000000000101
Il primo bit del risultato è 1 quindi si tratta di un numero negativo; il valore assoluto si ottiene facendone il complemento alla base che risulta 0111111111111011
(32.763 in decimale).
Il risultato dell’operazione è quindi -32.763.