9. Как мой компьютер хранит информацию в памяти?

Вероятно, вам известно, что вся хранимая информация представляет собой строки битов (bits) (binary digits; вы можете думать о них как большом количестве маленьких переключателей вкл/выкл). Здесь мы разъясним, как эти биты используются для представления букв и цифр, которые перемалывает ваш компьютер.

Прежде чем мы продолжим, вам необходимо понять, что такое размер слова (word size) вашего компьютера. Размер слова — это определяемый компьютером размер единицы информации с которой он работает; технически это ширина регистров (registers) процессора, областей которые процессор использует для арифметических и логических вычислений. Когда люди пишут или говорят о разрядности компьютера (называя их «32-битными» или «64-битными» компьютерами), вот что они имеют ввиду.

Большинство компьютеров (включая 386, 486, и Pentium) имеют размер слова в 32 бита. У старых 286 машин размер слова 16 бит. В мэйнфреймах старого стиля часто встречаются слова разрядностью 36 бит. Процессоры AMD Opteron, AMD Athlon64, Intel Itanium, и Alpha, использованные в машинах DEC, а сейчас Compaq имеют 64-битные слова.

Компьютер видит память как последовательность слов, пронумерованных от нуля до некоторого большого значения в зависимости от размера вашей памяти. Это значение ограничено размером слова, вот почему адресация больших объёмов памяти в программах на старых машинах, таких как 286, происходила через мучительные вывихи. Я не хочу обсуждать их здесь, они до сих пор снятся бывалым программистам в кошмарных снах.

9.1. Числа

Целые числа представляются словом или парой слов, в зависимости от размера слова вашего процессора. Самое распространённое представление целых чисел — одно 32-битное машинное слово.

Арифметика целых чисел близка к математической по основанию два, но не совсем. Бит младшего порядка это 1, следующий 2, затем 4 и так далее как в чистом двоичном счислении. Но числа со знаком представляются с помощью дополнительной нотации (twos-complement). Бит самого высокого порядка знаковый (sign bit) делает значение отрицательным, и каждое отрицательное число может быть получено из соответствующего ему положительного путём инвертирования всех битов и добавления единицы. Вот почему диапазон целых чисел на 32-битных машинах имеет представление от -231 до 231 - 1. 32-ой бит используется под знак; 0 означает положительное число или ноль, 1 отрицательное.

Некоторые языки программирования предоставляют вам доступ к беззнаковой арифметике (unsigned arithmetic) по основанию 2 и оперирует только положительными числами.

Большинство процессоров и некоторые компьютерные языки могут совершать операции над числами с плавающей запятой (floating-point) (эта способность встроена во все современные процессоры). Числа с плавающей запятой дают вам более широкий диапазон значений, чем целые, и позволяют вычислять дробную часть. Пути, которыми это достигается разнятся, и довольно сложны для детального обсуждения здесь, но их общая идея называется «научная нотация» («scientific notation») и она такова: дано, например, число 1.234 * 1023, при кодировании оно разделяется на мантиссу (mantissa) (1.234) и экспоненту (23) степень в которую возведено десять, это означает, что перемножив их, мы получим наше число с двадцатью нулями, 23 минус три знака после запятой.

9.2. Символы

Обычно символы представляются строками из семи битов, каждая из которых соответствует кодировке называемой ASCII (American Standard Code for Information Interchange) (Американский стандартный код обмена информацией). В современных машинах, все 128 ASCII символов представляются семью младшими битами октета (octet) или иначе 8-битного байта; октеты упаковываются в слова (например, строка из 6 символов займёт в памяти только два слова). Если хотите посмотреть на таблицу кодов ASCII, в ответ на приглашение Unix наберите «man 7 ascii».

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

Следующее заблуждение более важное — не весь мир использует ASCII. В действительности, большая часть мира не может использовать ASCII, отлично подходящий только для американского английского; в коде не хватает акцентированных и других специальных символов, нужных пользователям, использующим другие языки. Даже для британского английского имеется проблема  — отсутствует знак для обозначения национальной валюты (фунта).

Есть несколько попыток решить эту проблему. Все они используют старший восьмой бит, который не задействован в ASCII, образуя нижнюю половину набора из 256 символов. Наиболее широко используемый способ называется набор символов «Latin-1» (более формально ISO 8859-1). Это стандартный набор символов для Linux, HTML, и X. Microsoft Windows использует изменённую версию Latin-1, в которой добавлены ряд символов, такие как правые и левые двойные кавычки на тех позициях, которые не были использованы в Latin-1 по историческим причинам (критику и записки о том, какие это породило проблемы, читайте на странице demoroniser).

Latin-1 поддерживает западноевропейские языки, включая английский, французский, немецкий, испанский, итальянский, голландский, норвежский, шведский, датский. Однако этого также недостаточно, и как результат целую имеем серию кодировок от Latin-2 до -9, которые поддерживают такие языки как греческий, арабский, еврейский, эсперанто, сербский и хорватский. Подробности можно найти на странице ISO alphabet soup.

Окончательное решение вопроса кодировок даёт мощный стандарт, названный Unicode (и его близнец ISO/IEC 10646-1:1993). Unicode идентичен Latin-1 в нижних 256 позициях. Над ними 16-битное пространство, включающее греческий, кириллицу, армянский, еврейский, арабский, Devanagari, бенгальский, Gurmukhi, Gujarati, Oriya, Tamil, Telugu, Kannada, Malayalam, тайский, лаосский, грузинский, тибетский, японскую Кана, полный набор современного корейского Хангул, и унифицированный набор идеограмм китайского/японского/корейского (CJK). Подробная информация находится на домашней странице Unicode Unicode Home Page.