C'est une question de la façon dont les données sont stockées. Votre interaction avec Sam ferait une meilleure comparaison si vous le demandiez pour que vous puissiez l'écrire mais que vous ne disposiez que de huit caractères.
"Sam, donne-moi le numéro de téléphone."
"5555555555"
"Oh non, je n'ai plus de papier. Si seulement j'avais su à l'avance combien de données je demandais, j'aurais pu mieux préparer!"
Donc au lieu de cela, la plupart des langues vous obligent à déclarer un type, ainsi il saura et se préparera à l'avance:
"Sam, combien de temps dure un numéro de téléphone?"
"Dix personnages."
"Ok, alors laisse-moi avoir un plus gros morceau de papier. Maintenant, donne-moi le numéro de téléphone."
"5555555555"
"Compris! Merci Sam!"
Cela devient encore plus poilu quand on regarde les méthodes fondamentales de stockage des données. Si vous êtes comme moi, vous avez un cahier avec diverses notes, des chiffres tout bribouillés, aucun contexte ni étiquette pour quoi que ce soit, et vous n'avez aucune idée de ce que cela signifie trois jours plus tard. C'est aussi un problème pour les ordinateurs. Beaucoup de langues ont des types "int" (int, long, court, octet) et "float" (float, double). Pourquoi est-ce nécessaire?
Eh bien, voyons d'abord comment un entier est stocké et généralement représenté dans l'ordinateur. Vous êtes probablement conscient du fait qu'au niveau de base, tout est binaire (1 et 0). Le binaire est en fait un système de numération qui fonctionne exactement comme notre système de numération décimale. En décimal, vous comptez 0 à 9 (avec des zéros infinis implicites que vous n'écrivez pas), vous revenez à 0 et incrémentez le chiffre suivant de sorte que vous ayez 10. Vous répétez jusqu'à ce que vous passiez de 19 à 20, répéter jusqu'à ce que vous passez de 99 à 100, et ainsi de suite.
Le binaire n’est pas différent, sauf qu'au lieu de 0 à 9, vous comptez 0 à 1. 0, 1, 10, 11, 100, 101, 110, 111, 1000. Ainsi, lorsque vous tapez 9, en mémoire, elle est enregistrée en binaire. 1001. C'est un nombre réel. Il peut être ajouté, soustrait, multiplié, etc. exactement sous cette forme. 10 + 1 = 11. 10 + 10 = 100 (survolez 1 à 0 et portez le 1). 11 x 10 = 110 (et de manière équivalente, 11 + 11 = 110).
Maintenant dans la mémoire réelle (registres inclus), il y a une liste, un tableau, peu importe comment vous voulez l'appeler, de bits (potentiels 1 ou 0 ') l'un à côté de l'autre, c'est comment il garde ces bits organisés de manière logique pour faire une nombre supérieur à 1. Le problème, c'est que faites-vous avec des nombres décimaux? Vous ne pouvez pas simplement insérer un élément de matériel entre les deux bits du registre, et ajouter des "bits décimaux" entre chaque paire de bits coûterait beaucoup trop cher. Alors que faire?
Vous l'encodez. Généralement, l’architecture de la CPU ou du logiciel déterminera comment procéder. Cependant, une méthode courante consiste à stocker un signe (+ ou -, généralement 1 est négatif) dans le premier bit du registre, une mantisse (votre numéro décalé). Cependant, il est souvent nécessaire de supprimer la décimale) pour le nombre X suivant de bits et un exposant (le nombre de fois que vous avez dû le déplacer) pour le reste. C'est similaire à la notation scientifique.
La frappe permet au compilateur de savoir à quoi il ressemble. Imaginez que vous ayez stocké la valeur 1.3 dans le registre 1. Nous allons simplement créer ici notre propre schéma de codage de fantaisie, 1 bit pour le signe, 4 pour la mantisse, 3 pour l'exposant (1 bit pour le signe, 2 pour la magnitude). C'est un nombre positif, donc le signe est positif (0). Notre mantisse serait 13 (1101) et notre exposant serait -1 (101 (1 pour négatif, 01 = 1)). Donc nous avons stocké 01101101 dans le registre 1. Maintenant, nous n’avons pas tapé cette variable, donc quand le runtime va l’utiliser, il dit "bien sûr, c’est un entier, pourquoi pas", alors quand il affiche la valeur, on voit 109 (64 + 32 + 8 + 4 + 1), ce qui n’est évidemment pas correct.
Cependant, toutes les langues ne nécessitent pas explicitement de taper. C # a un mot clé "var" qui interprète le type d'une variable lors de la compilation, et d'autres langages comme Javascript sont typés de manière totalement dynamique, au point que vous pouvez stocker un entier dans une variable, puis l'assigner à un booléen, puis assignez-le à nouveau à une chaîne et la langue en gardera la trace.
Mais c’est beaucoup plus facile pour le compilateur, l’interprète ou le moteur d’exécution - et aboutit souvent à un programme plus rapide, car il n’a pas à dépenser de précieuses ressources pour trier tout ce qui est dactylographié - pour vous demander, à vous, le programmeur, quel type de les données que vous lui donnez.