Як мій комп’ютер працює з пам’яттю

Ви напевно знаєте, що вся інформація в комп’ютері зберігається у вигляді набору бітів (двійкових величин; їх можена уявляти у вигляді багатьох маленьких перемикачів між 1 та 0). Зараз ми з’ясуємо, як ці біти використовуються для представлення чисел і літер.

Але перед тим, як ми це зробимо, Вам необхідно знати, що таке величина слова^1 на Вашому комп’ютері. Розмір слова – це та кількість інформації, котру комп’ютер може обробити за один цикл процесора, те, що вміщеється в одну його команду; з технічного боку – це ширина регістрів процесора, котрі процесор використовує для арифметичних і логічних операцій. Коли люди говорять про свої комп’ютери, як такі що мають певну кількість бітів (наприклад, 32-бітні чи 64-бітні), вони мають на увазі саме це.

Більшість комп’ютерів (включаючи 386, 486, Pentium’и) мають довжину слова 32 біти. Їхні попередники, процесори 286 були 16-бітними. Старі великі ЕОМ мали, як правило, 36-бітні слова. AMD Opteron, Intel Itanium та Alpha (останні згодом відомі як DEC, а зараз — як Compaq) мають 64-бітні слова.

Комп’ютер розглядає пам’ять як послідовність слів, пронумерованих від 0 до певного великого числа, що залежить від розміру пам’яті. Це число все ж обмежене величиною слова, тому програмісти на старих 286-х процесорах мусіли вигадувати, як адресувати великі масиви пам’яті. Тепер старим програмістам можуть часом снитись нічні жахи, пов’язані з цими спогадами.

Числа

Цілі числа представляються як слова або пари слів, в залежності від величини слова вашого процесора. Одне 64-бітне слово є найпоширенішим способом зберігання цілого числа.

Цілочисельна арифметика є дуже близькою до двійкової, але все ж не тотожною їй. Першим по порядку бітом є 1, далі 2, потім 4 і далі по степенях двійки. Але числа зі знаком представлені у формі доповнення до двох. Найстарший за порядком біт є знаковим бітом, тобто він позначає негативне число, а кожне негативне число може бути отримане з відповідного позитивного інвертуванням всіх бітів та додаванням одиниці. Ось чому цілі числа на 64-бітній машині можуть приймати значення від  -231 до 231 - 1. 64-й біт позначає знак; 0 означає позитивне число або нуль, 1 – негативне число.

Деякі комп’ютерні мови дають вам доступ до беззнакової двійкової арифметики, у котрій немає негативних чисел.

Більшість процесорів та комп’ютерних мов можуть виконувати операції над числами з плаваючою комою (ця можливість вбудована в усі сучасні чіпи процесорів). Числа з плаваючою комою дають значно ширший діапазон значень, аніж цілі числа, та дозволяють оперувати з дробовою частиною числа. Спосіб, в який це реалізовано, є доволі складним, щоб обговорювати його тут, але основна ідея полягає у так званому науковому (експонентному) представлені числа, де можна записати, наприклад, 1,234 · 1023; кодування цього числа розділюється на мантису^2 (1,234) та експонентну частину^3 (23) – степінь десяти (тобто дане число мало б 20 нулів — степінь мінус дробова частина мантиси).

Символи

Символи, як правило, представляються як ланцюжки довжиною 7 біт кожен у кодуванні, що називається ASCII (American Standard Code for Information Interchange – американський стандарт кодування для обміну інформацією). На сучасних машинах кожен з 128 символів таблиці ASCII займає перших 7 бітів октету, або 8-бітного байта; октети пакуються у слова пам’яті, то ж, наприклад, шестисимвольний ланцюжок займе тільки два слова у пам’яті. Щоб отримати коди ASCII наберіть «man 7 ascii» у вашому командному рядку.

З попереднього параграфу можна зробити два помилкові висновки. Перший з них полягає в тому, що, хоча термін «октет» є формально правильним, він рідко вживається; більшість людей називають октет байтом^4 і очікують, що він обов’язково міститиме 8 біт. Строго кажучи, термін «байт» є більш широким; існували, наприклад, 36-бітні машини, у котрих байт мав 9 бітів (проте, швидше за все, таких машин вже більше не буде).

Другим, набагато важливішим моментом є те, що далеко не всі на світі вживають таблицю ASCII. Більшість людей не можуть цього робити – вона є хорошою для американської англійської, але у ній відсутні символи, що потрібні користувачам інших мов. Навіть для британської англійської відсутній символ фунта.

Було кілька спроб вирішити цю проблему. Всі вони використовували останній восьмий біт, що його не використовує ASCII, доповнюючи таким чином таблицю до 256 символів. Найбільшого поширення набула кодова таблиця Latin-1 (офіційна назва якої ISO 8859-1). Насупне твердження потребує експертної оцінки чи перевірки на актуальність: Це — типова таблиця символів для Linux, HTML та X. Microsoft Windows використовує видозмінену версію Latin-1, у котрій додано кілька символів, як, наприклад, ліві та праві подвійні лапки, на місця, котрі Latin-1 залишила вільними з історичних причин (щоб детальніше дізнатись про проблеми, які це спричиняє, дивіться http://www.fourmilab.ch/webtools/demoroniser/

Latin-1 охоплює мови західної Європи, включаючи англійську, французьку, німецьку, іспанську, італійську, датську, норвезьку, шведську, голландську. Оскільки це не вирішило проблеми повністю, то в результаті з'явилися додаткові набори, починаючи з Latin-2 і аж до Latin-9, котрі підтримують такі мови, як грецьку, арабську, іврит, есперанто, сербо-хорватську та інші. За детальною інформацією дивіться http://www.utia.cas.cz/user_data/vs/documents/ISO-8859-X-charsets.html.

Останнім рішенням став всеохоплюючий стандарт, названий Unicode (та його близнюк ISO/IEC 10646-1:1993). Юнікод ідентичний до Latin-1 своїми першими 256 позиціями. Окрім того у 16-бітному просторі він містить грецьку, кирилицю, вірменську, іврит, арабську, devanagari, bengali, gurmukhi, gujarati, oriya, таміл, telugu, kannada, malayalam, тайську, лао, грузинську, тибетську, японську кана, комплект сучасного корейського hangul, і об'єднаний набір ідеограм китайської/японської/корейської (CJK). За детальнішою інформацію дивіться | домашню сторінку стандарту Юнікод.

Сучасні версії Лінукса використовують варіант Юнікод під назвою UTF-8. В цьому кодуванні знаки від 0 по 127 є тими ж, що і у ASCII. Знаки 128-255 є організовані в комбінації від 2 до 4 байтів, якими позначають всі не-американські літери.