Si chiama rappresentazione (o codificazione) di un numero il modo in cui è descritto sotto forma binaria.
La rappresentazione dei numeri in un computer è indispensabile affinché quest'ultimo li possa immagazzinare e manipolare. Tuttavia il problema è che un numero matematico può essere infinito (indipendentemente dalla grandezza), ma la rappresentazione di un numero in un computer deve essere fatta su un numero di bit predefiniti. Si tratta quindi di pre-definire un numero di bit e il modo di usarli affinché questi possano rappresentare il più efficacemente possibile l'entità. Così sarà stupido codificare un carattere in 16 bit (65536 possibilità) quando se ne utilizzano generalmente meno di 256.
Un numero naturale è un numero intero positivo o nullo. La scelta (cioè il numero di bit da usare) dipende dalla tranche di numeri che si desidera utilizzare. Per codificare i numeri interi naturali compresi tra 0 e 255, basterà un 8 bit (un byte) dato che 28=256. In maniera più generale una codifica su n bit permetterà di rappresentare dei numeri interi naturali compresi tra 0 e 2n-1.
Per presentare un numero intero naturale dopo aver definito il numero di bit sul quale lo si codifica, basta sistemare ogni bit nella cellula binaria corrispondente a suo peso binario da destra verso sinistra, poi si «riempiono» i bit non utilizzati con degli zero.
Un numero intero relativo è un intero che può essere negativo. Si deve quindi codificare il numero in modo che si possa sapere se si tratta di un numero positivo o negativo, e bisogna che le regole di addizione siano conservate. L'astuzia sta nell'utilizzare una codifica chiamata complemento a due.
Un intero relativo positivo o nullo sarà rappresentato in binario (base 2) come un intero naturale, con la sola differenza che il bit di peso maggiore (il bit posto all'estrema sinistra) rappresenta il segno. Per un intero positivo bisogna quindi assicurarsi che sia a zero (0 corrisponde ad un segno positivo, 1 ad un negativo). Così se si codifica un intero naturale su 4 bit, il numero più grande sarà 0111 (cioè 7 in base decimale). In modo generale il più grande intero relativo positivo codificato su n bits sarà '2n-1-1.
Un intero relativo negativo è rappresentato grazie alla codifica in complemento a due. Principio di complemento a due, con numero negativo da rappresentare: prendiamo il suo opposto (il suo equivalente in positivo); lo si rappresenta in base 2 su n-1 bit; si complementa ogni bit (si inverte, cioè si sostituiscono gli zero con gli 1 e viceversa); gli si aggiunge 1;
Si noterà che sommando il numero e il suo complemento a due si ottiene 0. Vediamo ora un esempio pratico. Se si vuole codificare il valore -5 su 8 bit, basterà scrivere 5 in binario: 00000101; complementare con 1: 11111010; aggiungere 1: 11111011. La rappresentazione binaria di -5 su 8 bit è 11111011;
Commenti:
Il bit di peso maggiore è 1, si ha dunque un numero negativo. Si si sommano 5 e -5 ((00000101 e 11111011) si ha 0 (con un resto di 1).
Si tratta di rappresentare un numero binario con virgole (ad esempio 101,01 che non si legge cento uno virgola zero uno dato che è un numero binario ma 5,25 in decimale) sotto forma 1,XXXXX... * 2n (cioè nel nostro esempio 1,0101*22). La norma IEEE definisce il modo di codificare un numero reale. Questa norma si propone di codificare il numero in 32 bit e definisce tre componenti:
Il segno è rappresentato da un solo bit, il bit di peso maggiore (quello più a sinistra);
L'esponente è codificato sugli 8 bit consecutivi al segno;
La mantissa (i bit posti dopo la virgola) sui 23 bit rimanenti. Così la codifica si fa nella forma seguente:
seeeeeeeemmmmmmmmmmmmmmmmmmmmmmm
La s rappresenta il bit relativo al segno;
Le e rappresentano i bit relativi all'esponente;
Le m rappresentano i bit relativi alla mantissa.
Tuttavia vi sono alcune condizioni che devono essere rispettate dall'esponente:
L'esponente 00000000 è vietato, l'esponente 11111111 è vietato. Lo si utilizza talvolta per segnalare degli errori, chiamando questa configurazione di numero NaN, che significa Not a number. Bisogna aggiungere 127 (01111111) all'esponente per una conversione decimale in un numero reale binario. Gli esponenti possono quindi andare da -254 a 255. La formula d'espressione dei numeri reali è quindi la seguente: (-1)^S * 2^( E - 127 ) * ( 1 + F ), dove:
S è il bit di segno e si capisce quindi perché 0 è positivo ( -1^0=1 );
E è l'esponente ai quali si deve aggiungere 127 per ottenere il suo equivalente codificato;
F è la parte frazionata, la sola che si esprime e che è sommata a 1 per effettuare il calcolo.
Vediamo questa codifica in un esempio. Se si dovrà codificare il valore 525,5:
525,5 è positivo quindi il primo bit sarà 0;
La sua rappresentazione in base 2 è la seguente: 1000001101,1;
Normalizzando, si trova: 1,0000011011*2^9;
Si aggiunge 127 all'esponente che vale 9 il che da 136, ossia in base 2: 10001000;
La mantissa è composta dalla parte decimale di 525,5 in base normalizzata, cioè 0000011011.
Dato che la mantissa deve occupare 23 bit, è necessario aggiungere degli zeri per completarla:
00000110110000000000000
La rappresentazione del numero 525,5 in binario con la norma IEEE sarà quindi:
0 1000 1000 00000110110000000000000
0100 0100 0000 0011 0110 0000 0000 0000 (4403600 in esadecimali).
Ecco un altro esempio con un reale negativo. Se si dovrà codificare il valore -0,625:
Il primo bit vale 1 dato che 0,625 è negativo;
0,625 si scrive in base 2 nel modo seguente: 0,101;
Si vuole scriverlo sotto la forma 1.01 x 2-1;
Di conseguenza l'esponente vale 1111110 visto che 127 - 1 = 126 (cioè 1111110 in binario);
La mantissa è 01000000000000000000000 (solo le cifre dopo la virgola sono rappresentate, visto che il numero intero è sempre uguale a 1);
La rappresentazione del numero 0,625 in binario con la norma IEEE è:
1 1111 1110 01000000000000000000000
1111 1111 0010 0000 0000 0000 0000 0000 (FF 20 00 00 in esadecimali).
Foto: © Pixabay.