Es una cuestión de la forma en que se almacenan los datos. Tu interacción con Sam haría una mejor comparación si lo estuvieras preguntando para que pudieras escribirlo pero solo tuviera el papel de ocho caracteres.
"Sam, dame el número de teléfono".
"5555555555"
"Oh, no, me he quedado sin papel. ¡Si hubiera sabido de antemano la cantidad de datos que estaba pidiendo, podría haberme preparado mejor!"
Así que, en cambio, la mayoría de los idiomas te hacen declarar un tipo, por lo que sabrá y preparará con anticipación:
"Sam, ¿cuánto tiempo tiene un número de teléfono?"
"Diez caracteres".
"Bien, entonces déjame conseguir un pedazo de papel más grande. Ahora dame el número de teléfono".
"5555555555"
"¡Lo tengo! Gracias Sam!"
Se vuelve aún más peludo cuando observa las formas fundamentales reales en que se almacenan los datos. Si eres como yo, tienes un cuaderno con notas variadas, números garabateados, sin contexto ni etiquetas para nada, y no tienes idea de lo que significa tres días después. Esto también es un problema para las computadoras muchas veces. Muchos idiomas tienen tipos "int" (int, long, short, byte) y "float" (float, double). ¿Por qué es necesario?
Bueno, primero veamos cómo se almacena un entero, y generalmente se representa dentro de la computadora. Probablemente sea consciente de que en el nivel básico, todo es binario (1 y 0). Binario es en realidad un sistema numérico que funciona exactamente igual que nuestro sistema numérico decimal. En decimal, cuentas de 0 a 9 (con infinitos ceros iniciales implícitos que no escribes), luego vuelves a 0 e incrementas el siguiente dígito para que tengas 10. Repites hasta que pasas de 19 a 20, repita hasta que pase de 99 a 100, y así sucesivamente.
Binario no es diferente, excepto que en lugar de 0 a 9, cuentas 0 a 1. 0, 1, 10, 11, 100, 101, 110, 111, 1000. Entonces, cuando escribes 9, en la memoria eso es registrado en binario como 1001. Este es un número real. Se puede agregar, restar, multiplicar, etc., exactamente de esa forma. 10 + 1 = 11. 10 + 10 = 100 (pase de 1 a 0 y lleve el 1). 11 x 10 = 110 (y equivalentemente, 11 + 11 = 110).
Ahora en la memoria real (incluidos los registros), hay una lista, una matriz, como se quiera llamar, de bits (1 o 0 'potencial) uno al lado del otro, que es la forma en que mantiene estos bits lógicamente organizados para hacer un número mayor que 1. El problema es, ¿qué haces con los decimales? No puede simplemente insertar una pieza de hardware entre los dos bits en el registro, y costaría demasiado agregar "bits decimales" entre cada par de bits. Entonces, ¿qué hacer?
Usted lo codifica. Generalmente, la arquitectura de la CPU o el software determinará cómo se hace esto, pero una forma común es almacenar un signo (+ o -, generalmente 1 es negativo) en el primer bit del registro, una mantisa (su número cambió como muchas veces debe ser para deshacerse del decimal) para el siguiente número de bits X, y un exponente (el número de veces que tuvo que desplazarlo) para el resto. Es similar a la notación científica.
Escribir le permite al compilador saber lo que está viendo. Imagine que almacenó el valor 1.3 en el registro 1. Aquí presentamos nuestro propio esquema de codificación de fantasía, 1 bit para signo, 4 para mantisa, 3 para exponente (1 bit para signo, 2 para magnitud). Este es un número positivo, por lo que el signo es positivo (0). Nuestra mantisa sería 13 (1101) y nuestro exponente sería -1 (101 (1 para negativo, 01 = 1)). Así que almacenamos 01101101 en el registro 1. Ahora no escribimos esta variable, así que cuando el tiempo de ejecución se va a utilizar, dice "claro, este es un número entero, por qué no", así que cuando se imprime el valor vemos 109 (64 + 32 + 8 + 4 + 1), que obviamente no está bien.
Sin embargo, no todos los idiomas requieren que escribas explícitamente. C # tiene una palabra clave "var" que hace que el tipo de una variable se interprete en tiempo de compilación, y otros lenguajes como Javascript se escriben de forma totalmente dinámica, hasta el punto en que puede almacenar un número entero en una variable, luego asignarlo a un booleano. asignarlo de nuevo a una cadena y el idioma realiza un seguimiento de todo.
Pero es mucho más fácil para el compilador, el intérprete o el tiempo de ejecución, ya menudo resulta en un programa más rápido, ya que no tiene que gastar recursos valiosos en la clasificación de todo, para preguntarle a usted, el programador, qué tipo de datos le estás dando.