Це питання способу зберігання даних. Ваша взаємодія з Семом зробила б краще порівняння, якби ви запитували, щоб ваш міг записати це, але мав на папері лише вісім символів.
"Сем, дай мені номер."
"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 - мінус) у першому біті реєстру, мантісі (номер зміщений однак багато разів потрібно позбутися десяткової) для наступного числа X біт і показника (кількість разів, коли вам довелося його змістити) на залишок. Це схоже на наукові позначення.
Введення тексту дозволяє компілятору знати, на що він дивиться. Уявіть, що ви зберегли значення 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, повністю динамічно набираються, до того, що ви можете зберігати ціле число у змінній, а потім присвоювати його булевому, а потім присвоїти його знову рядку, і мова відстежує все це.
Але набагато простіше на компіляторі, інтерпретаторі чи під час виконання - і це часто призводить до більш швидкої програми, оскільки їй не доведеться витрачати цінні ресурси на сортування всього, щоб запитати вас, програміста, який саме тип дані, які ви їх надаєте.