Найти тему
ZDG

Биты и байты

Мы готовы начать программировать. Подытожим, что было в предыдущих выпусках. Если вы их не читали, то рекомендую сначала ознакомиться:

  1. Перед тем, как учить любой язык программирования, нужно научиться программировать. Язык и программирование – не одно и то же.
  2. Программирование – это не печать строчек на экране, а представление о том, в каких состояниях может находиться ваш объект, и как эти состояния менять.
  3. Состояние объекта доводится до абстрактного представления.
  4. В один элемент компьютерной памяти можно записать только 0 или 1, но элементов много, и мы можем взять их столько, сколько нужно.

Пора уже потихоньку начинать разговаривать по-программистски. Итак, один элемент компьютерной памяти, тот самый крохотный переключатель, который может только в 0 и 1, называется "бит". Это название, как и все остальные компьютерные термины, произошло из английского языка и значит "кусочек" (bit).

В предыдущих выпусках я приводил пример уборки комнаты как вполне себе процесс программирования. Сейчас, в самом начале этого процесса, ситуация такая: я придумал простейшее состояние комнаты, которое выражается одной цифрой 5. Для меня это значит: в комнате есть 5 книг. Я буду работать с этим состоянием дальше, но для начала я должен поместить его в память компьютера, чтобы с ним вообще можно было работать.

Вот память компьютера, которая состоит из большого количества элементов, или битов:

В памяти много битов - на картинке показана только часть
В памяти много битов - на картинке показана только часть

Число 5 в двоичной системе это 101. То есть для его записи в память нужно три бита. Я беру в памяти первые три бита и устанавливаю их в состояние 101:

в первые три бита я записал 101, то есть 5
в первые три бита я записал 101, то есть 5

Конечно, я не буду делать это всё вручную, это сделает компьютер за меня, но для глобального понимания вообще всего программирования важно понять эту одну операцию и ее последствия.

Сразу возникают вопросы: А куда можно записать еще одно число? А если это число будет занимать не 3 бита, а 12 бит? Как потом в памяти найти наше число 5? Как мы отделим запись одного числа от записи другого числа? Как мы узнаем, какое число сколько бит занимало?

Все эти вопросы решены следующим образом:

Все биты в памяти поделили на группы. Каждая группа состоит из 8 бит и называется "байт" (byte). Мы не можем записать в память меньше, чем один байт.

-3

Даже если для записи числа 5 требуется всего 3 бита, мы всё равно потратим 8 бит, чтобы записать туда 5. Выглядеть оно будет не как 101, а как 00000101, потому что слева добавятся старшие биты, которые просто не используются.

-4

То есть 5 бит из 8 пропадут зря. Это расточительство, но зато границы между соседними числами теперь хорошо известны – всем им выделено ровно по 8 бит.

Отсюда растут корни такого явления, как 8-битные игры, 8-битная графика, 8-битная музыка и прочее. Когда что-то называют 8-битным, имеют в виду, что оно старое и примитивное. Так оно и есть.

В 8 бит можно записать максимальное двоичное число 11111111, или в десятичном виде 255. Вместе с нулем получится 256 чисел. Так возникает главное ограничение. У картинки не может быть больше 256 цветов, у звука не может быть больше 256 уровней оцифровки, у игрока не может быть больше 256 предметов и так далее.

Конечно, все это можно решить с помощью изложенного ранее способа – если не хватает вместимости одной ячейки памяти, возьми ещё ячеек. Но тогда все значения в таких ячейка придется вычислять только вручную, учитывая, что и куда перенеслось. Это и медленно, и неудобно. Поэтому 8-битные игры такие примитивные и простые.

8-битная игра
8-битная игра

Сейчас такой проблемы уже нет. Потому что кроме 8 бит, ячейки памяти стали объединять в более крупные группы – сначала по 16 бит, затем по 32 бита, и наконец по 64 бита, а в современных видеокартах используется даже 128 бит. В 16 бит можно записать максимальное число 65535, в 32 бита можно записать уже около 4-х миллиардов, а в 64 бита – уже совсем немыслимое число. Так что ограничений, можно сказать, уже нет. Но минимальный размер ячейки памяти по-прежнему остался 8 бит, или 1 байт.

Ну, с записью числа в память справились, но из виду упущено кое-что важное, а именно – адресация. Но это тема еще на пару страниц, так что я сделаю для нее отдельный выпуск.