É uma questão de como os dados são armazenados. Sua interação com Sam faria uma comparação melhor se você estivesse perguntando para que você pudesse anotá-la, mas tivesse apenas oito caracteres em papel.
"Sam, me dê o número do telefone".
"5555555555"
"Ah, não, estou sem papel. Se ao menos soubesse antecipadamente quantos dados solicitava, poderia ter me preparado melhor!"
Portanto, a maioria dos idiomas faz com que você declare um tipo, para que ele saiba e se prepare com antecedência:
"Sam, quanto tempo é um número de telefone?"
"Dez caracteres."
"Ok, então deixe-me pegar um pedaço maior de papel. Agora me dê o número do telefone".
"5555555555"
"Entendi! Obrigado Sam!"
Fica ainda mais inchado quando você olha para as formas fundamentais reais de armazenamento dos dados. Se você é como eu, tem um caderno com anotações diversas, números apenas rabiscados, sem contexto ou etiqueta para nada, e não tem idéia do que isso significa três dias depois. Este é um problema para computadores muitas vezes também. Muitos idiomas têm tipos "int" (int, long, short, byte) e "float" (float, double). Por que isso é necessário?
Bem, primeiro vamos ver como um número inteiro é armazenado e geralmente representado dentro do computador. Você provavelmente está ciente de que, no nível básico, é tudo binário (1 e 0). Binário é na verdade um sistema numérico que funciona exatamente como o nosso sistema numérico decimal. Em decimal, você conta de 0 a 9 (com zeros iniciais implícitos infinitos que você não escreve), depois reverte para 0 e incrementa o próximo dígito para obter 10. Você repete até rolar de 19 para 20, repita até rolar de 99 para 100 e assim por diante.
Binário não é diferente, exceto que, em vez de 0 a 9, você conta de 0 a 1. 0, 1, 10, 11, 100, 101, 110, 111, 1000. Portanto, quando você digita 9, na memória gravada em binário como 1001. Este é um número real. Pode ser adicionado, subtraído, multiplicado, etc., exatamente dessa forma. 10 + 1 = 11. 10 + 10 = 100 (passe 1 para 0 e carregue o 1). 11 x 10 = 110 (e equivalente 11 + 11 = 110).
Agora, na memória real (registradores incluídos), há uma lista, matriz, como você quiser chamá-lo, de bits (1 ou 0 potencial) próximos um do outro, e é assim que ele mantém esses bits logicamente organizados para criar um número maior que 1. O problema é o que você faz com decimais? Você não pode simplesmente inserir um pedaço de hardware entre os dois bits no registro, e custaria muito adicionar "bits decimais" entre cada par de bits. Então o que fazer?
Você o codifica. Geralmente, a arquitetura da CPU ou do software determinará como isso é feito, mas uma maneira comum é armazenar um sinal (+ ou -, geralmente 1 é negativo) no primeiro bit do registro, uma mantissa (seu número mudou no entanto, muitas vezes é necessário livrar-se do decimal) para o seguinte número X de bits e um expoente (o número de vezes que você precisou alterá-lo) para o restante. É semelhante à notação científica.
Digitar permite que o compilador saiba o que está olhando. Imagine que você tenha armazenado o valor 1.3 no registrador 1. Vamos criar o nosso próprio esquema de codificação sofisticado aqui, 1 bit para sinal, 4 para mantissa, 3 para expoente (1 bit para sinal, 2 para magnitude). Como é um número positivo, o sinal é positivo (0). Nossa mantissa seria 13 (1101) e nosso expoente seria -1 (101 (1 para negativo, 01 = 1)). Então, armazenamos 01101101 no registro 1. Agora, não digitamos essa variável; portanto, quando o tempo de execução vai usá-la, ele diz "claro, este é um número inteiro, por que não", portanto, quando imprime o valor, vemos 109 (64 + 32 + 8 + 4 + 1), o que obviamente não está certo.
Porém, nem todo idioma exige que você digite explicitamente. O C # tem uma palavra-chave "var" que faz com que o tipo de uma variável seja interpretado em tempo de compilação, e outros idiomas como Javascript são totalmente digitados dinamicamente, a ponto de você poder armazenar um número inteiro em uma variável e atribuí-lo a um booleano. atribua-o novamente a uma string e o idioma acompanhará tudo.
Mas é muito mais fácil no compilador, no intérprete ou no tempo de execução - e geralmente resulta em um programa mais rápido, pois ele não precisa gastar recursos valiosos classificando a digitação de tudo - para perguntar ao programador que tipo de dados que você está fornecendo.