Esistono due motivi per cui 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 risparmieresti diversi 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 formato binario come:
0000 0000 0000 0000 0000 0000 0001 0110
Se non si ha familiarità con il sistema di numeri binari, questo può essere rappresentato in 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).
In sostanza, è solo una somma di 2 ^ (bit place) * value.
Ciò cambia quando ci si riferisce a valori che coinvolgono un punto decimale. Supponiamo di avere il numero 3,75 in decimale. Questo è indicato come 11.11 in binario. Possiamo rappresentarlo come notazione scientifica come 2 ^ 1 * 1 + 2 ^ 0 * 1 + 2 ^ -1 * 1 + 2 ^ -2 * 1 o, normalizzato, 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ò memorizzare solo 1 e 0. Qui entra in gioco il tipo di dati in virgola mobile.
Supponendo che la dimensione di (float) sia di 4 byte, allora hai un totale di 32 bit. Al primo bit viene assegnato il "bit di segno". Non ci sono float o doppi non firmati. I successivi 8 bit sono usati per "l'esponente" e gli ultimi 23 bit sono usati come "significante" (o talvolta indicato come mantissa). Usando il nostro esempio 3.75, il nostro esponente sarebbe 2 ^ 1 e il nostro significato sarebbe 1.111.
Se il primo bit è 1, il numero è negativo. In caso contrario, positivo. L'esponente viene modificato da qualcosa chiamato "il bias", quindi non possiamo semplicemente archiviare "0000 0010" come esponente. Il bias per un numero in virgola mobile a precisione singola è 127 e il bias per una doppia precisione (è qui che il tipo di dati doppio prende il nome) è 1023. Gli ultimi 23 bit sono riservati per il significato. Il significato è 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 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 un numero in virgola mobile e come un numero intero:
0100 0001 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 1000
In che modo il computer aggiungerà 8.0 e 8? O anche moltiplicarli !? Il computer (più specificamente, i computer x86) ha diverse parti della CPU che aggiungono numeri in virgola mobile e numeri interi.