É uma questão de como os dados são armazenados. Sua interação com Sam faria uma comparação melhor se você pedisse para que pudesse escrevê-la, mas tivesse apenas oito caracteres de papel.
"Sam, give me the phoneNumber."
"5555555555"
"Oh no I'm out of paper. If only I had known ahead of time how much data I was asking for I could have prepared better!"
Então, em vez disso, a maioria dos idiomas faz você declarar um tipo, para que ele saiba e se prepare antes:
"Sam, how long is a telephone number?"
"Ten characters."
"Ok, then let me get a bigger piece of paper. Now give me the phoneNumber."
"5555555555"
"Got it! Thanks Sam!"
Fica ainda mais difícil quando você olha para as formas fundamentais em que os dados são armazenados. Se você é como eu, você tem um caderno com notas diversas, números rabiscados, sem contexto ou rotulação para qualquer coisa, e você não tem idéia do que isso significa três dias depois. Este é um problema para os computadores muitas vezes também. Muitas linguagens têm os tipos "int" (int, long, short, byte) e "float" (float, double). Por que isso é necessário?
Bem, primeiro vamos ver como um inteiro é armazenado e geralmente representado dentro do computador. Você provavelmente está ciente de que, no nível básico, é tudo binário (1's e 0's). 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 infinitos implícitos que você não escreve), então você rola de volta para 0 e incrementa o próximo dígito para que você tenha 10. Você repete até você rolar de 19 para 20, repita até passar de 99 para 100 e assim por diante.
Binário não é diferente, exceto que em vez de 0 a 9, você conta 0 a 1. 0, 1, 10, 11, 100, 101, 110, 111, 1000. Então, quando você digita 9, na memória, gravado 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 (role sobre 1 para 0 e carregue o 1). 11 x 10 = 110 (e equivalentemente, 11 + 11 = 110).
Agora, na memória real (registradores incluídos), há uma lista, array, o que você quiser chamá-lo, de bits (potencial 1 ou 0 ') próximos uns dos outros, que é como ele mantém esses bits logicamente organizados para fazer um número maior que 1. Problema é, o que você faz com decimais? Você não pode simplesmente inserir uma peça de hardware entre os dois bits no registrador, e custaria demais acrescentar "bits decimais" entre cada par de bits. Então o que fazer?
Você 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 (o seu número mudou, no entanto, muitas vezes é necessário para se livrar do decimal) para o seguinte número X de bits e um expoente (o número de vezes que você teve que mudá-lo) para o restante. É semelhante à notação científica.
A digitação permite que o compilador saiba o que está vendo. Imagine que você armazenou o valor 1.3 no registrador 1. Vamos criar nosso próprio esquema de codificação, 1 bit para sinal, 4 para mantissa, 3 para expoente (1 bit para sinal, 2 para magnitude). Este é um número positivo, então o sinal é positivo (0). Nossa mantissa seria 13 (1101) e nosso expoente seria -1 (101 (1 para negativo, 01 = 1)). Então nós armazenamos 01101101 no registrador 1. Agora nós não digitamos essa variável, então quando o tempo de execução vai usá-la, ela diz "certo, isso é um inteiro porque não" então quando ele imprime o valor vemos 109 (64 + 32 + 8 + 4 + 1), o que obviamente não está certo.
Nem todo idioma exige que você digite explicitamente, no entanto. C # tem uma palavra-chave "var" que faz com que o tipo de uma variável seja interpretada em tempo de compilação, e outras linguagens como Javascript são totalmente dinamicamente digitadas, a ponto de você poder armazenar um inteiro em uma variável e então atribuí-lo a um booleano. atribuí-lo novamente a uma string e o idioma mantém o controle de tudo.
Mas é muito mais fácil no compilador, intérprete ou tempo de execução - e geralmente resulta em um programa mais rápido, já que ele não precisa gastar recursos valiosos ordenando tudo - para perguntar a você, o programador, que tipo de dados você está dando.