Hay dos razones por las que debería preocuparse por los diferentes tipos de datos numéricos.
1. Ahorro de memoria
for(long k=0;k<=10;k++)
{
//stuff
}
¿Por qué usar un largo cuando podría ser fácilmente un número entero o incluso un byte? De hecho, ahorraría varios bytes de memoria al hacerlo.
2. Los números de coma flotante y los números enteros se almacenan de manera diferente en la computadora
Supongamos que tenemos el número 22 almacenado en un número entero. La computadora almacena este número en la memoria en binario como:
0000 0000 0000 0000 0000 0000 0001 0110
Si no está familiarizado con el sistema de números binarios, esto se puede representar en notación científica como: 2 ^ 0 * 0 + 2 ^ 1 * 1 + 2 ^ 2 * 1 + 2 ^ 3 * 0 + 2 ^ 4 * 1 + 2 ^ 5 * 0 + ... + 2 ^ 30 * 0. El último bit puede o no usarse para indicar si el número es negativo (dependiendo de si el tipo de datos está firmado o no).
Esencialmente, es solo una suma de 2 ^ (lugar de bit) * valor.
Esto cambia cuando se refiere a valores que involucran un punto decimal. Supongamos que tiene el número 3.75 en decimal. Esto se conoce como 11.11 en binario. Podemos representar esto como una notación científica como 2 ^ 1 * 1 + 2 ^ 0 * 1 + 2 ^ -1 * 1 + 2 ^ -2 * 1 o, normalizado, como 1.111 * 2 ^ 2
Sin embargo, la computadora no puede almacenar eso: no tiene un método explícito para expresar ese punto binario (la versión del sistema de números binarios del punto decimal). La computadora solo puede almacenar 1's y 0's. Aquí es donde entra el tipo de datos de coma flotante.
Suponiendo que el tamaño de (flotante) es de 4 bytes, entonces tiene un total de 32 bits. Al primer bit se le asigna el "bit de signo". No hay flotadores ni dobles sin firmar. Los siguientes 8 bits se usan para el "exponente" y los 23 bits finales se usan como el "significado" (o a veces se lo denomina mantisa). Usando nuestro ejemplo 3.75, nuestro exponente sería 2 ^ 1 y nuestro significado sería 1.111.
Si el primer bit es 1, el número es negativo. Si no, positivo. El exponente se modifica por algo llamado "el sesgo", por lo que no podemos simplemente almacenar "0000 0010" como exponente. El sesgo para un número de coma flotante de precisión simple es 127, y el sesgo para una precisión doble (aquí es donde el tipo de datos doble recibe su nombre) es 1023. Los 23 bits finales están reservados para el significado. El significado es simplemente los valores a la DERECHA de nuestro punto binario.
Nuestro exponente sería el sesgo (127) + exponente (1) o representado en binario
1000 0000
Nuestro significado sería:
111 0000 0000 0000 0000 0000
Por lo tanto, 3.75 se representa como:
0100 0000 0111 0000 0000 0000 0000 0000
Ahora, veamos el número 8 representado como un número de coma flotante y como un número entero:
0100 0001 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 1000
¿Cómo demonios va a agregar la computadora 8.0 y 8? ¿O incluso multiplicarlos? La computadora (más específicamente, las computadoras x86) tienen diferentes porciones de la CPU que agregan números de punto flotante y números enteros.