Ci sono due ragioni per le quali dovresti preoccuparti dei diversi tipi di dati numerici.
1. Salvataggio della memoria
for(long k=0;k<=10;k++)
{
//stuff
}
Perché usare un lungo quando potrebbe essere altrettanto facilmente un numero intero, o anche un byte? In questo modo risparmierai parecchi byte di memoria.
2. I numeri in virgola mobile e i numeri interi sono memorizzati in modo diverso nel computer
Supponiamo di avere il numero 22 memorizzato in un numero intero. Il computer memorizza questo numero in memoria in binario come:
0000 0000 0000 0000 0000 0000 0001 0110
Se non hai familiarità con il sistema dei numeri binari, questo può essere rappresentato nella notazione scientifica come:
2 ^ 0 * 0 + 2 ^ 1 * 1 + 2 ^ 2 * 1 + 2 ^ 3 * 0 + 2 ^ 4 * 1 + 2 ^ 5 * 0 + ... + 2 ^ 30 * 0. L'ultimo bit può o non può essere utilizzato per indicare se il numero è negativo (a seconda che il tipo di dati sia firmato o non firmato).
Essenzialmente, è solo una somma del valore 2 ^ (bit place) *.
Questo cambia quando ti riferisci a valori che coinvolgono un punto decimale. Supponiamo di avere il numero 3.75 in decimale. Si parla di 11.11 in binario. Possiamo rappresentare questo come una notazione scientifica come 2 ^ 1 * 1 + 2 ^ 0 * 1 + 2 ^ -1 * 1 + 2 ^ -2 * 1 o, normalizzata, come 1.111 * 2 ^ 2
Tuttavia, il computer non può memorizzarlo: non ha un metodo esplicito per esprimere quel punto binario (la versione del sistema di numeri binari del punto decimale). Il computer può solo memorizzare 1 e 0. Qui è dove arriva il tipo di dati in virgola mobile.
Supponendo che sizeof (float) sia 4 byte, allora hai un totale di 32 bit. Al primo bit viene assegnato il "bit di segno". Non ci sono galleggianti o doppi senza segno. Gli 8 bit successivi sono usati per "esponente" e gli ultimi 23 bit sono usati come "significando" (oa volte indicato come mantissa). Usando il nostro esempio 3.75, il nostro esponente sarebbe 2 ^ 1 e il nostro significato e sarebbe 1.111.
Se il primo bit è 1, il numero è negativo. In caso contrario, positivo. L'esponente viene modificato da qualcosa chiamato "il pregiudizio", quindi non possiamo semplicemente memorizzare "0000 0010" come esponente. Il bias per un singolo numero in virgola mobile di precisione è 127 e il bias per una precisione doppia (questo è il punto in cui il doppio tipo di dati ottiene il suo nome) è 1023. Gli ultimi 23 bit sono riservati per il significato. Il significato e semplicemente i valori a DESTRA del nostro punto binario.
Il nostro esponente sarebbe il bias (127) + esponente (1) o rappresentato in binario
1000 0000
Il nostro significato e sarebbe:
111 0000 0000 0000 0000 0000
Pertanto, 3,75 è rappresentato come:
0100 0000 0111 0000 0000 0000 0000 0000
Ora, diamo un'occhiata al numero 8 rappresentato come numero in virgola mobile e come numero intero:
0100 0001 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 1000
In che modo il mondo aggiungerà 8.0 e 8? O addirittura moltiplicarli !? I computer (in particolare i computer x86) hanno parti diverse della CPU che aggiungono numeri in virgola mobile e numeri interi.