Вероятно, вам известно, что вся хранимая информация представляет из себя строки битов (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, происходила через мучительные вывихи. Я не хочу обсуждать их здесь, они до сих пор снятся бывалым программистам в кошмарных снах.
Целые числа представляются словом или парой слов, в зависимости от размера слова вашего процессора. Самое распространенное представление целых чисел одно 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 минус три знака после запятой.
Обычно символы представляются строками из семи битов, каждая из которых соответствует кодировке называемой 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.