6. Ячейки, слова, полуслова, байты и недостатки восьмеричной системы.Учитель (декламирует): ...Нам не дано предугадать, как слово наше отзовется...
Юный программист: А сколько байт в слове?
Мы с вами рассмотрели вкратце восьмеричную систему счисления. Между прочим, в то время, когда программисты стали ее применять для облегчения работы с двоичными числами, знакомое нам уже понятие байт в компьютерах не использовалось. Вместо байтов машинная память состояла из
ячеек или
машинных слов. При этом у каждой машины размер слова был свой. Мне, например, довелось работать с машиной, размер слова которой был 36 бит. То есть, хранимое в одной ячейке слово состояло из 36 двоичных разрядов, что легко представить как 12 триад, а значит, записать это слово можно было с помощью 12 восьмеричных цифр. У других видов компьютеров размер слова мог быть другим.
Такой разнобой в хранении информации был вполне допустим каждый компьютер работал отдельно, никакой речи о переносимости данных с одних видов компьютеров на другие не было, так что и проблем не было.
С развитием вычислительной техники, однако, встал вопрос о переносе данных и соответственно, о стандартизации основного кирпичика, из которого строится память компьютера ячейки и, соответственно, с заменой ячеек произвольного размера стандартным байтом.
При этом, однако, возникла другая проблема: 36-битную ячейку вполне можно использовать для хранения результатов реальных вычислений как-никак, максимальное число, которое можно туда поместить, составляет несколько десятков миллиардов. Байт же для большинства вычислений маловат ну, никак нельзя свести все вычисления к числам, не превышающим 256. Что делать?
Решение оказалось очень простым: если нам не хватает одного байта, давайте рассматривать два соседних байта как единое целое, как единое шестнадцатибитное число. А если и этого мало, давайте использовать три, четыре и т.д.
Так и поступили. При этом, в зависимости от типов компьютеров,
словом стали называть два или четыре байта. Если слово четырехбайтное, может использоваться еще и комбинация из двух байтов с названием
полуслово.
Все, вроде бы, хорошо, но тут неожиданно оказалось, что восьмеричная система не так уж и хороша. Давайте рассмотрим пример.
Допустим, у нас есть полуслово, содержащее какое-то значение, скажем
1 0 1 1 1 0 0 1 0 1 1 0 0 0 1 1. Разбив его на триады, получим:
1 - 0 1 1 - 1 0 0 - 1 0 1 - 1 0 0 - 0 1 1, что соответствует восьмеричному
1 3 4 5 4 3. Обратите внимание на то, что самая первая триада неполная.
Теперь давайте разобьем наше полуслово на составляющие его байты:
1 0 1 1 1 0 0 1 - - 0 1 1 0 0 0 1 1 Посмотрим, как в восьмеричной системе будут представляться эти байты. Опять начнем с разбиения на триады:
1 0 - 1 1 1 - 0 0 1 - - 0 1 - 1 0 0 - 0 1 1, что соответствует восьмеричным представлениям для байтов
2 7 1 - - 1 4 3. Опять же, в каждом из байтов старшая триада неполная.
Как легко заметить, восьмеричное представление двухбайтовой комбинации никак не соответствует комбинации восьмеричных представлений для каждого из составляющих ее байтов. Это вполне естественно. Если внимательно посмотреть, становится ясно, что распределение битов по триадам различается по одной простой причине: в байт не укладывается целое число триад, и, при объединении байтов в двухбайтовое полуслово, неполная триада младшего байта дополняется битом из старшего, тем самым полностью меняя распределение битов по триадам.
Как вы полагаете, в чем причина такого явления? Правильно, в том, что байт состоит из восьми битов, триада из трех, а восемь на три не делится. В чем же решение? Уж коль скоро основным элементом памяти является байт, для представления двоичных чисел надо использовать такую систему, которая, обладая преимуществами восьмеричной, не будет обладать ее недостатками. Кандидатов оказывается два: четверичная система и шестнадцатеричная система. В первой одной цифре соответствует две двоичные, а во второй четыре. Соответственно, в байте может поместиться ровно четыре четверичных цифры или ровно две шестнадцатеричных.
Повидимому, было сочтено, что основание четыре все же слишком маленькое, и числа будут получаться слишком длинными. Поэтому, на сегодняшний день для удобного представления используемых в компьютере двоичных чисел повсеместно применяется
шестнадцатеричная система.
7. Шестнадцатеричная система.Давайте разберемся, как устроена шестнадцатеричная система и как с ней работать.
По аналогии с предыдущими рассуждениями мы уже можем сделать вывод о том, что в этой системе используется шестнадцать цифр и что при перемещении цифры на один разряд влево значение задаваемого ею числа возрастает в 16 раз. Если со вторым все более не менее понятно, то с шестнадцатью цифрами возникает вопрос: а как их обозначать? Действительно, пока что нам было достаточно привычных десяти цифр, так как и восьмеричная и двоичная системы требуют меньше цифр. Однако, для шестнадцатеричной системы надо что-то придумать.
Решений может быть много. Например, придумать какие-нибудь новые изображения для недостающих цифр. Или взять, скажем, японские иероглифы. Или просто подчеркнуть существующие цифры, скажем, 0 для одиннадцатой цифры, 1 для двенадцатой и т.д.
Однако, самым распространенным на сегодняшний день в программировании является использование первых шести букв латинского алфавита. Таким образом, полный набор цифр для шестнадцатеричной системы выглядит так:
0 1 2 3 4 5 6 7 8 9 A B C D E FЗадание 6. Создайте таблицу соответствия значений от 0 до 256 для двоичной, восьмеричной, десятичной и шестнадцатеричной систем. Определите, какой комбинации из четырех двоичных цифр соответствует каждая шестнадцатеричная цифра.
Давайте посмотрим, как осуществляется перевод из шестнадцатеричной системы в десятичную и обратно. Будем действовать так же, как и с двоичной и восьмеричной системами. Здесь нам очень пригодятся результаты задания 6. Начнем с перевода шестнадцатеричного числа
8e3c в десятичную систему:
8e3c = 8 * 16**3 + e * 16**2 + 3 * 16**1 + c = 8 * 4096 + 14 * 256 + 3 * 16 + 12 =
= 36412
Первое время вам может понадобиться таблица из задания 6 для того, чтобы определить, какое число соответствует, скажем, цифре
e или
c, в дальнейшем значения шести букв-цифр запомнятся.
Теперь давайте осуществим обратный перевод:
36412 / 16 = 2275 (остаток
12)
2275 / 16 = 142 (3)
142 / 16 = 8 (14)
8 / 16 = 0 ( 8 )Выписываем их в обратном порядке. Получаем
8<14>3<12>. Преобразовав, в соответствии с таблицей из задания 6,
14 в
e и
12 в
c, получим
8e3c. Что и требовалось.
Перевод из шестнадцатеричной системы в двоичную и обратно чрезвычайно прост. Поскольку каждой шестнадцатеричной цифре соответствует в точности четыре двоичные, все, что для этого требуется знать, какая комбинация из четырех двоичных разрядов (тетрада) соответствует каждой из шестнадцати цифр. На первый порах вам, скорее всего, понадобится помощь таблицы из задания 6, однако в дальнейшем, если вы будете постоянно такими переводами заниматься, соответствие тетрад шестнадцатеричным цифрам запомнится.
Вот как выглядит это соответствие:
0000 0
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
1000 8
1001 9
1010 A
1011 B
1100 C
1101 D
1110 E
1111 F
Арифметические действия в шестнадцатеричной системе я здесь разбирать не буду. Желающие смогут сами попробовать это удовольствие. Главное помнить, что все делается аналогично десятичной и двоичной системам. Придется, правда, иметь под рукой (или выучить!) шестнадцатеричную таблицу умножения, размер которой в два с половиной раза превышает привычную десятичную.
8. Важные свойства шестнадцатеричной системы, используемые при работе с компьютерами.
Самым, пожалуй, важным свойством шестнадцатеричной системы при работе с компьютерами является то, что в один байт вмещается ровно две шестнадцатеричные цифры. Это естественно, поскольку шестнадцатеричная цифра соответствует четырем двоичным разрядам, а байт состоит из восьми двоичных разрядов. Собственно, ради этого шестнадцатеричная система и была принята в компьютерных дисциплинах. Соответственно, двухбайтовые данные будут представлены четырьмя шестнадцатеричными цифрами и т.д.
Надо сказать, что шестнадцатеричная система на сегодняшний день настолько прочно вошла в компьютерный и околокомпьютерный мир, что очень часто появляется не только в серьезных языках программирования, но и в средствах, ориентированных скорее на пользователя, чем на программиста. В частности, вполне возможно, что вам приходилось сталкиваться с обозначением цвета вроде
"#FFFFFF" или, скажем,
C07F40. В обоих случаях, как вы уже догадались, использованы шестнадцатеричные числа. Дело в том, что в последнее время очень часто применяется 24-битное представление цвета, а это в точности соответствует трем байтам или шести шестнадцатеричным цифрам.
Окончание следует.