Há duas razões pelas quais você deve se preocupar com os diferentes tipos de dados numéricos.
1. Economizando memória
for(long k=0;k<=10;k++)
{
//stuff
}
Por que usar um longo quando poderia facilmente ser um número inteiro ou mesmo um byte? Você realmente salvaria vários bytes de memória ao fazer isso.
2. Números de ponto flutuante e números inteiros são armazenados de forma diferente no computador
Suponha que temos o número 22 armazenado em um número inteiro. O computador armazena esse número na memória em binário como:
0000 0000 0000 0000 0000 0000 0001 0110
Se você não conhece o sistema de números binários, isso pode ser representado em notação científica como: 2 ^ 0 * 0 + 2 ^ 1 * 1 + 2 ^ 2 * 1 + 2 ^ 3 * 0 + 2 ^ 4 * 1 + 2 ^ 5 * 0 + ... + 2 ^ 30 * 0. O último bit pode ou não ser usado para indicar se o número é negativo (dependendo se o tipo de dados é assinado ou não).
Essencialmente, é apenas um somatório de 2 ^ (bit place) * value.
Isso muda quando você está se referindo a valores que envolvem um ponto decimal. Suponha que você tenha o número 3,75 em decimal. Isso é conhecido como 11.11 em binário. Podemos representar isso como uma notação científica como 2 ^ 1 * 1 + 2 ^ 0 * 1 + 2 ^ -1 * 1 + 2 ^ -2 * 1 ou, normalizada, como 1.111 * 2 ^ 2
O computador não pode armazenar isso no entanto: não possui um método explícito de expressar esse ponto binário (a versão do sistema de números binários do ponto decimal). O computador pode armazenar apenas 1 e 0. É aqui que o tipo de dados de ponto flutuante entra.
Supondo que sizeof (float) seja 4 bytes, você terá um total de 32 bits. O primeiro bit é atribuído ao "bit de sinal". Não há carros alegóricos ou duplos não assinados. Os próximos 8 bits são usados para o "expoente" e os 23 bits finais são usados como o "significando" (ou algumas vezes chamado de mantissa). Usando nosso exemplo de 3,75, nosso expoente seria 2 ^ 1 e nosso significando seria 1,111.
Se o primeiro bit for 1, o número é negativo. Se não, positivo. O expoente é modificado por algo chamado "o viés"; portanto, não podemos simplesmente armazenar "0000 0010" como expoente. O viés para um número de ponto flutuante de precisão única é 127 e o viés para uma precisão dupla (é aqui que o tipo de dados duplo recebe seu nome) é 1023. Os 23 bits finais são reservados para o significando. O significando são simplesmente os valores à DIREITA do nosso ponto binário.
Nosso expoente seria o viés (127) + expoente (1) ou representado em binário
1000 0000
Nosso significado seria:
111 0000 0000 0000 0000 0000
Portanto, 3,75 é representado como:
0100 0000 0111 0000 0000 0000 0000 0000
Agora, vejamos o número 8 representado como um número de ponto flutuante e como um número inteiro:
0100 0001 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 1000
Como no mundo o computador adicionará 8.0 e 8? Ou mesmo multiplicá-los !? O computador (mais especificamente, computadores x86) possui diferentes partes da CPU que adicionam números de ponto flutuante e números inteiros.