Es una cuestión de la forma en que se almacenan los datos. Su interacción con Sam sería una mejor comparación si estuviera preguntando para poder escribirla, pero solo tenía ocho caracteres de papel.
"Sam, dame el número de teléfono".
"5555555555"
"Oh no, no tengo papel. ¡Si hubiera sabido de antemano cuántos datos estaba pidiendo, podría haberme preparado mejor!"
Entonces, en cambio, la mayoría de los idiomas te hacen declarar un tipo, por lo que sabrá y se preparará con anticipación:
"Sam, ¿cuánto dura un número de teléfono?"
"Diez personajes".
"Ok, entonces déjame obtener 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 difícil cuando observa las formas fundamentales reales en que se almacenan los datos. Si eres como yo, tienes un cuaderno con notas misceláneas, números garabateados, sin contexto o etiquetado para nada, y no tienes idea de lo que significa tres días después. Este 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 eso necesario?
Bueno, primero veamos cómo se almacena un número entero y, en general, cómo se representa dentro de la computadora. Probablemente sepa que en el nivel básico, todo es binario (1 y 0). Binary es en realidad un sistema de números que funciona exactamente como nuestro sistema de números decimales. En decimal, cuenta de 0 a 9 (con infinitos ceros iniciales implícitos que no escribe), luego vuelve a 0 e incrementa el siguiente dígito para que tenga 10. Repite hasta pasar 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, cuenta de 0 a 1. 0, 1, 10, 11, 100, 101, 110, 111, 1000. Entonces, cuando escribe 9, en la memoria que está registrada en binario como 1001. Este es un número real. Se puede sumar, restar, multiplicar, etc., exactamente de esa forma. 10 + 1 = 11. 10 + 10 = 100 (pasar 1 a 0 y llevar el 1). 11 x 10 = 110 (y equivalente, 11 + 11 = 110).
Ahora en la memoria real (registros incluidos), hay una lista, matriz, como quiera llamarlo, de bits (potenciales 1 o 0 ') uno al lado del otro, que es cómo 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 lo que hay que hacer?
Lo codificas. En general, 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ó) sin embargo, muchas veces es necesario deshacerse del decimal) para el siguiente número X de bits, y un exponente (el número de veces que tuvo que cambiarlo) para el resto. Es similar a la notación científica.
Escribir le permite al compilador saber lo que está viendo. Imagine que ha almacenado el valor 1.3 en el registro 1. Vamos a encontrar nuestro propio esquema de codificación elegante aquí, 1 bit para signo, 4 para mantissa, 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, por lo que cuando el tiempo de ejecución va a usarla, dice "claro, este es un número entero por qué no", así que cuando imprime el valor vemos 109 (64 + 32 + 8 + 4 + 1), lo que obviamente no es correcto.
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 de que puede almacenar un número entero en una variable, luego asignarlo a un booleano, luego 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, y a menudo resulta en un programa más rápido ya que no tiene que gastar recursos valiosos clasificando todo, para preguntarle a usted, el programador, qué tipo de datos que le estás dando.