Это вопрос способа хранения данных. Ваше взаимодействие с Сэмом могло бы быть лучше, если бы вы спросили, чтобы вы могли записать его, но у вас было всего восемь знаков бумаги.
"Сэм, дай мне номер телефона."
"5555555555"
«О нет, у меня нет бумаги. Если бы я знал заранее, сколько данных я запрашивал, я мог бы подготовиться лучше!»
Таким образом, вместо большинства языков вы объявляете тип, поэтому он будет знать и готовиться заранее:
"Сэм, как долго номер телефона?"
«Десять символов».
«Хорошо, тогда позвольте мне взять лист бумаги побольше. Теперь дайте мне номер телефона».
"5555555555"
"Понял! Спасибо Сэм!"
Это становится еще более опасным, когда вы смотрите на фактические основные способы хранения данных. Если вы похожи на меня, у вас есть записная книжка с различными заметками, просто набросанными цифрами, без контекста или ярлыков для чего-либо, и вы не имеете ни малейшего понятия, что это означает через три дня. Это проблема для компьютеров также много раз. Многие языки имеют типы «int» (int, long, short, byte) и «float» (float, double). Почему это необходимо?
Ну, во-первых, давайте посмотрим, как целое число хранится и в целом представлено в компьютере. Вы, вероятно, знаете, что на базовом уровне это все двоичные (1 и 0). Двоичная система - это система счисления, которая работает точно так же, как наша десятичная система счисления. В десятичном исчислении вы считаете от 0 до 9 (с бесконечными подразумеваемыми ведущими нулями, которые вы не пишете), затем вы возвращаетесь к 0 и увеличиваете следующую цифру, чтобы получить 10. Вы повторяете, пока не перевернете с 19 на 20, повторяйте пока не перевернете с 99 на 100 и так далее.
Двоичные значения ничем не отличаются, за исключением того, что вместо 0 до 9 вы считаете от 0 до 1. 0, 1, 10, 11, 100, 101, 110, 111, 1000. Поэтому, когда вы вводите 9, в памяти, записанной в двоичном виде как 1001. Это фактическое число. Он может быть добавлен, вычтен, умножен и т. Д., Именно в этой форме. 10 + 1 = 11. 10 + 10 = 100 (переверните 1 к 0 и держите 1). 11 х 10 = 110 (и, что эквивалентно, 11 + 11 = 110).
Теперь в фактической памяти (включая регистры) есть список, массив, как бы вы ни хотели его назвать, битов (потенциальных 1 или 0 ') рядом друг с другом, что позволяет логически организовывать эти биты для создания число больше 1. Проблема в том, что вы делаете с десятичными числами? Вы не можете просто вставить аппаратную часть между двумя битами в регистре, и будет слишком дорого добавлять «десятичные биты» между каждой парой битов. Так что делать?
Вы кодируете это. Как правило, архитектура процессора или программного обеспечения будет определять, как это делается, но один из распространенных способов - сохранить знак (+ или -, как правило, 1 отрицательный) в первом бите регистра, мантиссе (ваш номер сдвинут однако много раз необходимо избавиться от десятичного числа) для следующего числа битов Х и показателя степени (числа раз, когда вам пришлось его сдвигать) для остатка. Это похоже на научную запись.
Ввод позволяет компилятору знать, на что он смотрит. Представьте, что вы сохранили значение 1,3 в регистре 1. Мы просто придумаем здесь нашу собственную причудливую схему кодирования: 1 бит для знака, 4 для мантиссы, 3 для показателя степени (1 бит для знака, 2 для величины). Это положительное число, поэтому знак положительный (0). Наша мантисса будет 13 (1101), а наш показатель будет -1 (101 (1 для отрицательного, 01 = 1)). Таким образом, мы храним 01101101 в регистре 1. Теперь мы не вводили эту переменную, поэтому, когда среда выполнения начинает использовать ее, она говорит «конечно, это целое число, почему нет», поэтому, когда она печатает значение, мы видим 109 (64 + 32 + 8 + 4 + 1), что явно не правильно.
Однако не каждый язык требует от вас явного ввода. В C # есть ключевое слово «var», которое заставляет интерпретировать тип переменной во время компиляции, а другие языки, такие как Javascript, полностью динамически типизированы, так что вы можете сохранить целое число в переменной, затем присвоить его логическому значению, а затем назначьте это снова строке, и язык отслеживает все это.
Но это намного проще для компилятора, интерпретатора или среды выполнения - и часто приводит к более быстрой программе, поскольку ей не нужно тратить ценные ресурсы на сортировку всего - спросить вас, программиста, какого рода данные вы даете это.