È una questione di come vengono archiviati i dati. La tua interazione con Sam farebbe un paragone migliore se te lo chiedessi in modo da poterlo scrivere, ma aveva solo carta di otto caratteri.
"Sam, dammi il numero di telefono."
"5555555555"
"Oh no, ho esaurito la carta. Se solo avessi saputo in anticipo quanti dati avrei chiesto avrei potuto preparare meglio!"
Quindi, invece, molte lingue ti fanno dichiarare un tipo, così saprà e preparerà in anticipo:
"Sam, quanto dura un numero di telefono?"
"Dieci personaggi."
"Ok, allora fammi prendere un pezzo di carta più grande. Ora dammi il numero di telefono."
"5555555555"
"Capito! Grazie Sam!"
Diventa ancora più peloso se osservi i modi fondamentali effettivi in cui i dati vengono archiviati. Se sei come me, hai un quaderno con note varie, numeri appena scritti, nessun contesto o etichettatura per nulla, e non hai idea di cosa significhi qualcosa tre giorni dopo. Questo è un problema anche per i computer molte volte. Molte lingue hanno tipi "int" (int, long, short, byte) e "float" (float, double). Perché è necessario?
Bene, prima diamo un'occhiata a come viene memorizzato un numero intero, e generalmente rappresentato all'interno del computer. Probabilmente sei consapevole che a livello base è tutto binario (1 e 0). Binario è in realtà un sistema numerico che funziona esattamente come il nostro sistema numerico decimale. In decimale, conti da 0 a 9 (con infiniti zeri iniziali impliciti che non scrivi), quindi torna indietro a 0 e incrementa la cifra successiva in modo da avere 10. Ripeti finché non passi da 19 a 20, ripetere fino a quando non si passa da 99 a 100 e così via.
Binario non è diverso, tranne per il fatto che invece di 0 a 9, si contano da 0 a 1. 0, 1, 10, 11, 100, 101, 110, 111, 1000. Quindi, quando si digita 9, nella memoria registrata in binario come 1001. Questo è un numero reale. Può essere aggiunto, sottratto, moltiplicato, ecc. Esattamente in quella forma. 10 + 1 = 11. 10 + 10 = 100 (passa da 1 a 0 e porta il 1). 11 x 10 = 110 (e equivalentemente, 11 + 11 = 110).
Ora nella memoria effettiva (registri inclusi), c'è un elenco, un array, qualunque cosa tu voglia chiamarlo, di bit (potenziali 1 o 0 ') uno accanto all'altro, che è come mantiene questi bit organizzati logicamente per creare un numero maggiore di 1. Il problema è che cosa fai con i decimali? Non puoi semplicemente inserire un pezzo di hardware tra i due bit nel registro e costerebbe troppo aggiungere "bit decimali" tra ogni coppia di bit. Quindi che si fa?
Lo codifichi. Generalmente, l'architettura della CPU o del software determinerà come farlo, ma un modo comune è quello di memorizzare un segno (+ o -, generalmente 1 è negativo) nel primo bit del registro, una mantissa (il tuo numero spostato tuttavia molte volte deve essere necessario eliminare il decimale per il seguente numero X di bit e un esponente (il numero di volte in cui è stato necessario spostarlo) per il resto. È simile alla notazione scientifica.
La digitazione consente al compilatore di sapere cosa sta guardando. Immagina di aver memorizzato il valore 1.3 nel registro 1. Troveremo qui il nostro schema di codifica fantasia, 1 bit per segno, 4 per mantissa, 3 per esponente (1 bit per segno, 2 per grandezza). Questo è un numero positivo, quindi il segno è positivo (0). La nostra mantissa sarebbe 13 (1101) e il nostro esponente sarebbe -1 (101 (1 per negativo, 01 = 1)). Quindi memorizziamo 01101101 nel registro 1. Ora non abbiamo digitato questa variabile, quindi quando il runtime lo usa, dice "certo, questo è un numero intero perché no" quindi quando stampa il valore vediamo 109 (64 + 32 + 8 + 4 + 1), che ovviamente non è giusto.
Tuttavia, non tutte le lingue richiedono di digitare esplicitamente. C # ha una parola chiave "var" che fa interpretare il tipo di una variabile al momento della compilazione, e altre lingue come Javascript sono tipizzate in modo totalmente dinamico, al punto che è possibile memorizzare un numero intero in una variabile, quindi assegnarlo a un valore booleano, quindi assegnarlo di nuovo a una stringa e la lingua tiene traccia di tutto.
Ma è molto più facile per il compilatore, l'interprete o il runtime - e spesso si traduce in un programma più veloce poiché non deve spendere risorse preziose per ordinare attraverso la digitazione di tutto - per chiedere a te, al programmatore, che tipo di dati che stai fornendo.