Ciao,

un numero in virgola mobile si può rappresentare con la formula:


dove:
S è il segno(0 se il numero è positivo, 1 se il numero è negativo).
E è l'esponente.
M è la mantissa (cioè la parte frazionaria).

Lo standard IEEE P754 prevede che, quando per rappresentare un valore reale sono usati 32 bit (singola precisione), questi siano ripartiti secondo il seguente schema:

–> 1 bit per il segno S
–> 8 bit per l’esponente E
–> 23 bit per la mantissa M

Graficamente:


Per i numeri in virgola mobile a precisione doppia(64 bit), lo schema è il seguente:

–> 1 bit per il segno S
–> 11 bit per l’esponente E
–> 52 bit per la mantissa M

L'esponente deve potere assumere valori negativi. Nella rappresentazione polarizzata, una costante viene sottratta al valore contenuto nell’esponente per ricavare il valore “vero” dell’esponente stesso.
Nello standard IEEE P754 su 32 bit la quantità di polarizzazione è pari a 127 e la rappresentazione polarizzata è detta codice eccesso 127.

La mantissa, per garantire che il numero sia unicamente rappresentato, viene portata ad avere un valore >= 1 e < 2 e l’esponente viene adattato opportunamente, quindi si hanno sempre numeri della forma 1,aaaa...a.
Poiché l'uno alla sinistra della virgola esiste sempre, si risparmia un bit di spazio se non lo si rappresenta(hidden bit).
Eccezione alla regola è costituita dal numero zero che si rappresenta impostando a zero tutti i bit.

Vediamo un esempio.

Per rappresentare il numero 5.12 nello standard IEEE a precisione singola(32 bit):

a) il numero è positivo, dunque il bit di segno(il bit più significativo e cioè quello più a sinistra), vale 0.
b) 5,21 in binario, è uguale a 101,000111.
c) spostiamo la virgola di due posizioni verso sinistra e moltiplichiamo per 2 elevato al numero di posizioni: 1,01000111*2^2 (questo procedimento prende il nome di normalizzazione).
d) l'esponente in codice eccesso 127 è 2 + 127 = 129 che, in formato binario, è uguale a 10000001.

Dunque, il risultato è:

0 10000001 01000111000000000000000


Nel caso del tuo esercizio, la rappresentazione non è nel formato standard visto che prevede 7 bit per la mantissa e un codice eccesso 128.
Il numero si rappresenta così:

0 10000011 0100101 (10,3125 in decimale).

Il bit più significativo vale 0; dunque il numero è positivo. Gli otto bit successivi rappresentano l'esponente:

10000011 in decimale è uguale a 131; essendo in codice eccesso 128, bisogna sottrargli 128:

131 - 128 = 3.

I sette bit meno significativi, rappresentano la parte frazionaria della mantissa:

0100101 considerando l'hidden bit, diventa 1,0100101. Per ottenere il numero rappresentato, spostiamo la virgola verso destra di 3(131 - 128) posizioni: 1010,0101.

Arrotondiamo per difetto (non consideriamo cioè la parte frazionaria) il risultato che diventa, quindi, 1010.
La rappresentazione su sedici bit è la seguente:

0000 0000 0000 1010.

In generale, dato un numero N in base b su x cifre, si definisce complemento alla base:

b^x - N.

Quando la base è 2, si ha il complemento a 2. Per il calcolo si applica il seguente algoritmo:

a) partendo da destra si trascrivono tutti gli 0 fino ad incontrare il primo 1 e si trascrive anch'esso.
b) si complementano a 1 (e cioè tutti gli 0 diventano 1 e viceversa) tutti i restanti bit.

nel nostro caso, abbiamo:

0000 0000 0000 1010 (10 in decimale).

Partendo da destra incontriamo uno 0 e lo trascriviamo:

0

il secondo bit incontrato vale 1; lo trascriviamo:

10

i bit successivi vanno tutti complementati a 1:

1111 1111 1111 0110 (-10 in decimale).

Un altro modo per ottenere il complemento a due di un numero è il seguente:

a) si complementa a uno il numero.
b) si aggiunge 1 al risultato.