È una questione del modo in cui i dati vengono archiviati. La tua interazione con Sam farebbe un confronto migliore se lo chiedessi in modo che tu possa scriverlo, ma ha solo un valore di otto caratteri.
"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!"
Quindi, la maggior parte delle lingue ti fa dichiarare un tipo, quindi lo saprà e lo preparerà in anticipo:
"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!"
Diventa ancora più peloso quando si osservano i reali modi fondamentali in cui i dati vengono archiviati. Se sei come me, hai un quaderno con note varie, numeri appena scarabocchiati, nessun contesto o etichetta per nulla, e non hai idea di cosa significhi tre giorni dopo. Questo è un problema anche per i computer. 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 viene rappresentato all'interno del computer. Probabilmente sei consapevole del fatto che a livello di base, è tutto binario (1 e 0). Il binario è in realtà un sistema numerico che funziona esattamente come il nostro sistema numerico decimale. In decimale, contate da 0 a 9 (con gli zeri iniziali impliciti infiniti che non scrivete), quindi tornate indietro a 0 e incrementate la cifra successiva in modo da avere 10. Si ripete fino al rollover da 19 a 20, ripeti fino al rollover da 99 a 100 e così via.
Il binario non è diverso, tranne che invece di 0 a 9, conti 0 a 1. 0, 1, 10, 11, 100, 101, 110, 111, 1000. Quindi quando scrivi 9, nella memoria è registrato 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 in modo equivalente, 11 + 11 = 110).
Ora nella memoria attuale (registri inclusi), c'è una lista, array, qualunque cosa tu voglia chiamare, di bit (potenziali 1 o 0 ') uno accanto all'altro, che è il modo in cui mantiene questi bit logicamente organizzati per fare un numero maggiore di 1. Il problema è, cosa fai con i decimali? Non puoi semplicemente inserire un pezzo di hardware tra i due bit nel registro, e costerebbe troppo per aggiungere "bit decimali" tra ogni coppia di bit. Quindi cosa fare?
Lo codifichi. Generalmente, l'architettura della CPU o del software determinerà come ciò viene fatto, ma un modo comune è di memorizzare un segno (+ o -, generalmente 1 è negativo) nel primo bit del registro, una mantissa (il tuo numero è spostato tutte le volte che deve essere necessario per 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 archiviato il valore 1.3 nel registro 1. Verremo qui con il nostro schema di codifica di fantasia, 1 bit per il segno, 4 per mantissa, 3 per esponente (1 bit per il segno, 2 per la magnitudine). 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 inserito questa variabile, quindi quando il runtime va ad usarlo, dice "sicuro, questo è un numero intero perché no", quindi quando stampa il valore vediamo 109 (64 + 32 + 8 + 4 + 1), che ovviamente non è corretto.
Tuttavia, non tutte le lingue richiedono di digitare in modo esplicito. C # ha una parola chiave "var" che fa interpretare il tipo di una variabile in fase di compilazione e altri linguaggi come Javascript sono digitati in modo totalmente dinamico, al punto che è possibile memorizzare un numero intero in una variabile, quindi assegnarlo a un valore booleano, quindi assegnalo nuovamente a una stringa e la lingua tiene traccia di tutto.
Ma è molto più semplice sul compilatore, sull'interprete o sul runtime - e spesso si traduce in un programma più veloce poiché non deve spendere risorse preziose per ordinare la digitazione di tutto - per chiederti, il programmatore, che tipo di dati stai dando.