Глава 15
Байты
и шестнадцатеричные
числа
Две усовершенствованных версии суммирующей машины из
предыдущей главы наглядно иллюстрируют концепцию по-
токов данных (data paths). В пределах схемы от одного компо-
нента к другому перемещаются 8-битовые значения. Они по-
даются на входы сумматоров, защелок и селекторов, они же
выводятся из этих устройств. 8-битовые значения задаются
переключателями и отображаются лампочками. Говорят, что
поток данных в этой схеме имеет ширину 8 битов. Почему
именно 8? Почему не 6, или 7, или 9, или 10?
Можно было бы сказать: потому, что в основу этих усо-
вершенствованных версий положена исходная суммирующая
машина из главы 12, а она работает с 8-битовыми значениями.
Но никаких особых причин делать ее 8-битовой у нас не было.
Просто это число в тот момент показалось особенно удобным.
Впрочем, признаюсь, что все это время я немного хитрил, так
как прекрасно знал (как, вероятно, и вы), что именно 8 битов
составляют один байт (byte).
Слово «байт» родилось в фирме IBM году этак в 1956. Про-
изошло оно от английского слова «bite» (кусок), но писалось
216
Глава пятнадцатая
через «y», чтобы никто не путал его со словом «bit» (т. е. бит).
В течение некоторого времени термином «байт» обозначалось
просто число битов в потоке данных. Но в середине 60-х, в
связи с созданием в IBM компьютеров System/360, это слово
стало обозначать группу из 8 битов.
Будучи 8-разрядным числом, байт может принимать зна-
чения от 00000000 до 11111111. Этими кодами можно обозна-
чить положительные числа от 0 до 255 или положительные и
отрицательные числа от –127 до 128 (если они записаны с по-
мощью дополнения до 2). 1 байт позволяет зашифровать 2
8
,
или 256, различных вариантов.
Потом выяснилось, что 8-разрядность байта очень удобна
по многим причинам. Для IBM она оказалась привлекатель-
ной, так как облегчала хранение данных в формате BCD, к ко-
торому я вернусь в главе 23. Но, как мы убедимся в следую-
щих главах, по случайному совпадению именно 8-битовый
байт удобен для хранения текста, поскольку практически лю-
бой язык мира (кроме идеографического письма, используе-
мого в Китае, Японии и Корее) можно представить в виде на-
бора менее чем 256 символов. Байт также идеален для кодиро-
вания оттенков серого на черно-белых фотографиях, посколь-
ку человеческий глаз этих оттенков также различает прибли-
зительно 256. А там, где не хватает 1 байта (как, скажем, в упо-
мянутых идеографических языках), обычно любую проблему
можно решить с помощью 2 байтов, которыми кодируются
уже 2
16
, или 65 536 вариантов.
Половину байта, т. е. 4 бита, иногда называют тетрадой
(nibble или nybble), но используют этот термин гораздо реже
термина «байт».
Поскольку в описании внутренней жизни компьютеров
байты используются очень часто, их значения желательно за-
писывать максимально кратко. 8-разрядное двоичное число
10110110, например, весьма наглядно, но коротким его не на-
зовешь.
Конечно, к байтам всегда можно обращаться по их деся-
тичным значениям, но для этого их придется постоянно пере-
водить из двоичной в десятичную систему счисления. Вычис-
ление хоть и не особо сложное, но утомительное. В главе 8 я
продемонстрировал способ решения этой задачи «в лоб». По-
217
Байты и шестнадцатеричные числа
скольку каждая двоичная цифра соответствует степени двой-
ки, мы можем просто выписать все цифры двоичного числа,
указав под каждым из них двойку в соответствующей степе-
ни. Затем перемножаем числа в столбцах и складываем резуль-
таты. Вот как преобразуется число 10110110:
x128
+
x64
x32
x16
x8
x4
x2
x1
+
+
+
+
+
+
=
1
0
1
1
0
1
1
0
128
0
32
16
0
4
2
0
182
Для обратного преобразования потребуется более неуклю-
жая процедура, состоящая в последовательном делении деся-
тичного числа на убывающие степени двойки. При этом част-
ное есть соответствующая двоичная цифра, а остаток делится
на следующую по убыванию степень двойки. Вот как преоб-
разовать число 182 обратно в двоичный формат:
128
64
32
16
8
4
2
1
1
0
1
1
0
1
1
0
182
54
54
22
6
6
2
0
В главе 8 этот метод описан очень подробно. Но даже из одно-
го примера ясно, что для преобразования десятичных чисел в
двоичные и обратно нужно запастись листом бумаги, каран-
дашом и терпением.
В главе 8 мы познакомились также с восьмеричной систе-
мой счисления, в которой используются только цифры 0, 1, 2,
3, 4, 5, 6 и 7. Превращать восьмеричные числа в двоичные и
обратно очень просто. Нужно лишь запомнить 3-битовые эк-
виваленты всех восьмеричных цифр, указанных в следующей
таблице.
Двоичное
Восьмеричное
000
0
001
1
010
2
011
3
218
Глава пятнадцатая
Двоичное
Восьмеричное
100
4
101
5
110
6
111
7
Возьмите нужное двоичное число (например, 10110110) и
разбейте на группы по три бита, начиная справа. Каждая груп-
па из трех битов соответствует восьмеричной цифре.
10110110
2 6
6
Таким образом, байт 10110110 выражается восьмеричным чис-
лом 266. Что ж, число существенно сократилось, а значит
восьмеричные числа действительно удобны для записи бай-
тов. К сожалению, с восьмеричной системой связана неболь-
шая проблема.
В двоичном выражении значение байта варьируется от
00000000 до 11111111. В восьмеричной системе этому диапа-
зону соответствуют числа от 000 до 377. Очевидно, что в пре-
дыдущем примере, правой и средней восьмеричным цифрам
соответствуют полные тройки битов, а на левую цифру оста-
лось только два бита. Это значит, что восьмеричное представ-
ление 16-битового числа:
1011001111000101
1 3
1
7
0
5
не совпадает с восьмеричным представлением двух составля-
ющих его байтов:
10110011
2 6
3
11000101
3 0
5
Чтобы представление многобайтового значения согласовыва-
лось с представлением входящих в него байтов, нужна систе-
(продолжение)
219
Байты и шестнадцатеричные числа
ма, в которой байт делился бы на группы с равным числом
битов. Это значит, что мы должны делить байт либо на 4 груп-
пы по 2 бита (четверичная система), либо на 2 группы по 4
бита (шестнадцатеричная система).
С шестнадцатеричной системой мы до сих пор не сталки-
вались, и хорошо. У нее и название-то — язык сломаешь! —
шестнадцатеричная (hexadecimal). Но это еще полбеды, есть
и другие проблемы. В десятичной системе мы считаем так:
0 1 2 3 4 5 6 7 8 9 10 11 12…
В восьмеричной системе, как вы помните, нам удалось изба-
виться от цифр 8 и 9:
0 1 2 3 4 5 6 7 10 11 12…
В четверичной системе отпадает нужда в цифрах 4, 5, 6 и 7:
0 1 2 3 10 11 12…
И, наконец, в двоичной можно обойтись только 0 и 1:
0 1 10 11 100…
С шестнадцатеричной системой все не так просто — в ней
требуется больше цифр, чем в десятичной. Счет в этой шест-
надцатеричной системе выглядит примерно так:
0 1 2 3 4 5 6 7 8 9 ? ? ? ? ? ? 10 11 12…
где 10 в действительности означает 16
ДЕСЯТЬ
. Знаки вопроса на-
глядно демонстрируют, что для представления шестнадцате-
ричных чисел нам необходимо еще 6 символов. Что это за сим-
волы? Откуда их взять? Что ж, ни из какой многовековой тра-
диции они не проистекают, поэтому мы вольны выбрать их
по своему усмотрению, например:
В отличие от символов, которыми обозначаются другие циф-
ры, у этих есть большое преимущество — их легко запомнить
и отождествить с тем количеством, что они выражают: ковбой-
ская шляпа (емкость — 10 галлонов), футбольный мяч (в ко-
манде 11 игроков), дюжина (т. е. 12) пончиков, черная кошка
220
Глава пятнадцатая
(неразрывно связанная с числом 13), полная луна (красуется на
небе через 14 дней после новолуния) и, наконец, кинжал, кото-
рый напомнит нам об убийстве Юлия Цезаря в 15-й день марта.
Для выражения байта нужны две шестнадцатеричных циф-
ры. Иначе говоря, шестнадцатеричная цифра эквивалентна
четырем битам, или тетраде. В таблице показано, как преобра-
зовывать двоичные, шестнадцатеричные и десятичные числа.
1000
1010
1011
1100
1101
1110
8
8
10
11
12
13
14
15
0100
0110
0101
4
6
5
4
6
5
0000
0001
0010
0011
0
0
1
2
3
3
2
1
0111
7
7
Двоич-
ное
Шестнадца-
теричное
Деся-
тичное
Двоич-
ное
Шестнад-
цатеричное
Деся-
тичное
1111
15
1001
9
9
Вот как выглядит в шестнадцатеричном формате число
10110110:
10110110
6
При работе с многобайтовыми числами все происходит точно
так же.
11000101
5
10110110
6
Один байт всегда представляется одной и той же парой шест-
надцатеричных цифр.
221
Байты и шестнадцатеричные числа
К сожалению (а может, и к счастью), использовать футболь-
ные мячи и пончики в качестве цифр мы не будем, помня, одна-
ко, что они с этой ролью вполне справлялись. Вместо них в
шестнадцатеричной системе приняты куда менее понятные обо-
значения цифр, которые многих навсегда сбивают с толку. Шесть
недостающих цифр в действительности представляются первы-
ми шестью буквами латинского алфавита:
0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12…
В следующей таблице показано истинное соответствие между
двоичными, шестнадцатеричными и десятичными числами.
Двоичное
Шестнадцатеричное
Десятичное
0000
0
0
0001
1
1
0010
2
2
0011
3
3
0100
4
4
0101
5
5
0110
6
6
0111
7
7
1000
8
8
1001
9
9
1010
A
10
1011
B
11
1100
C
12
1101
D
13
1110
E
14
1111
F
15
Таким образом, байт 10110110 представляется парой шестнад-
цатеричных чисел В6, а футбольный мяч вам рисовать не при-
дется. В предыдущих главах я указывал вид системы счисле-
ния в нижнем индексе, например:
10110110
ДВА
— для двоичной системы,
2312
ч
ЕТЫРЕ
222
Глава пятнадцатая
— для четверичной,
266
ВОСЕМЬ
— для восьмеричной,
182
ДЕСЯТЬ
— для десятичной. Продолжая ту же традицию, записываем
В6
ШЕСТНАДЦАТЬ
— для шестнадцатеричной системы. Получилось очень гро-
моздко, но, к счастью, на практике используются другие, бо-
лее экономные способы обозначения шестнадцатеричных чи-
сел. Можно, например, идентифицировать шестнадцатерич-
ное число так:
B6
HEX
В дальнейшем я буду использовать еще более популярный
способ обозначения шестнадцатеричных чисел, который со-
стоит в добавлении к числу строчной латинской буквы h:
B6h
В шестнадцатеричной системе положение цифры соответ-
ствует степени числа 16.
Количество 1
Количество 16
Количество 256
Количество 4 096
Количество 65 536
Шестнадцатеричное число 9A48Ch представляется так:
9A48Ch = 9
´ 10000h +
A
´ 1000h +
4
´ 100h +
8
´ 10h +
C
´ 1h
Переписываем это выражение с помощью степеней числа 16:
223
Байты и шестнадцатеричные числа
9A48Ch = 9
´ 16
4
+
A
´ 16
3
+
4
´ 16
2
+
8
´ 16
1
+
C
´ 16
0
или их десятичных значений:
9A48Ch = 9
´ 65 536 +
A
´ 4 096 +
4
´ 256 +
8
´ 16 +
C
´ 1
Заметьте, что при записи одиночных цифр (9, A, 4, 8, C) нет
нужды указывать в индексе систему счисления. 9 всегда 9 не-
зависимо от того, десятичная или шестнадцатеричная система
счисления использована. С другой стороны, А очевидно явля-
ется шестнадцатеричной цифрой, эквивалентной числу 10 в
десятичной системе.
Чтобы завершить вычисление, все шестнадцатеричные
цифры нужно заменить их десятичными значениями:
9A48Ch = 9
´ 65 536 +
10
´ 4 096 +
4
´ 256 +
8
´ 16 +
12
´ 1
Ответ — 631 948. Так шестнадцатеричные числа преобразу-
ются в десятичные.
Нарисуем шаблон для преобразования произвольного 4-
значного шестнадцатеричного числа в десятичный формат.
×
4096
+
×
256
×
16
×
1
+
+
=
Подставим в него число 79ACh. Учитывая, что шестнадцате-
ричные числа A и C равны десятичным 10 и 12, получаем:
224
Глава пятнадцатая
×
4 096
+
×
256
×
16
×
1
+
+
=
28 672
2304
160
12
31 148
7
9
A
C
При преобразовании десятичного числа в шестнадцатерич-
ный формат, не обойтись без деления. Если число меньше либо
равно 255, его можно представить одним байтом, т. е. двумя
шестнадцатеричными цифрами. Чтобы вычислить их, разде-
лите число на 16, чтобы получить частное и остаток. Рассмот-
рим уже знакомый пример — десятичное число 182. Разделив
его на 16, получаем 11 (шестнадцатеричная цифра В) и 6 в ос-
татке. Итак, шестнадцатеричный эквивалент — В6h.
Если преобразуемое число меньше 65 536, для его представ-
ления понадобится не более четырех цифр. Вот как выглядит
шаблон для преобразования такого числа в шестнадцатерич-
ный формат:
256
16
1
4 096
Для начала поместите исходное десятичное число в левый
верхний прямоугольник. Это ваше первое делимое. Разделите
его на 4 096, первый делитель. Частное записываете в прямо-
угольник под делимым, а остаток — в прямоугольник справа
от делимого. Остаток становится следующим делимым, кото-
рое нужно разделить на 256. Вот как преобразовать в шестнад-
цатеричный формат число 31 148:
256
16
1
31 148
2476
172
12
7
9
10
12
4 096
Разумеется, вместо 10 и 12 нужно написать соответствующие
шестнадцатеричные цифры и получить в результате 79ACh.
225
Байты и шестнадцатеричные числа
Если вы решите выполнять все вычисления на калькуля-
торе, то столкнетесь с проблемой: калькулятор не показывает
остаток от деления. Разделив 31 148 на 4 096, вы получите
7,6044921875. Чтобы узнать остаток, вам придется умножить
4 096 на 7 (получив 28 672) и вычесть результат из 31 148 или
умножить 4 096 на 0,6044921875, т. е. дробную часть результа-
та деления (или просто применить функцию преобразования
чисел между десятичным и шестнадцатеричным форматами,
которая имеется во многих калькуляторах!).
Еще один способ преобразования числа от 0 до 65 535 в
шестнадцатеричный формат состоит в его делении на 256, что-
бы сразу разбить число на два байта. Затем каждый байт нуж-
но разделить на 16. Вот как выглядит шаблон для этой проце-
дуры:
16
16
256
Начинайте с самого верха. При каждом делении записывайте
частное в левый прямоугольник под делимым, а остаток — в
правый прямоугольник под делимым. Вот как выглядит пре-
образование числа 51 966:
16
16
256
12
10
15
14
51 966
202
254
Заменив десятичные числа 12, 10, 15 и 14 шестнадцатеричны-
ми цифрами, получаем CAFE, что больше напоминает слово,
чем число!
226
Глава пятнадцатая
Ниже приводится таблица сложения для шестнадцатерич-
ного формата.
+
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
0
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
1
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
10
2
2
3
4
5
6
7
8
9
A
B
C
D
E
F
10
11
3
3
4
5
6
7
8
9
A
B
C
D
E
F
10
11
12
4
4
5
6
7
8
9
A
B
C
D
E
F
10
11
12
13
5
5
6
7
8
9
A
B
C
D
E
F
10
11
12
13
14
6
6
7
8
9
A
B
C
D
E
F
10
11
12
13
14
15
7
7
8
9
A
B
C
D
E
F
10
11
12
13
14
15
16
8
8
9
A
B
C
D
E
F
10
11
12
13
14
15
16
17
9
9
A
B
C
D
E
F
10
11
12
13
14
15
16
17
18
A
A
B
C
D
E
F
10
11
12
13
14
15
16
17
18
19
B
B
C
D
E
F
10
11
12
13
14
15
16
17
18
19
1A
C
C
D
E
F
10
11
12
13
14
15
16
17
18
19
1A
1B
D
D
E
F
10
11
12
13
14
15
16
17
18
19
1A
1B
1C
E
E
F
10
11
12
13
14
15
16
17
18
19
1A
1B
1C
1D
F
F
10
11
12
13
14
15
16
17
18
19
1A
1B
1C
1D
1E
С помощью этой таблицы и обычных правил сложения в стол-
бик, вы будете легко складывать шестнадцатеричные числа.
4A3378E2
+ 877AB982
D1AE3264
Как вы помните из главы 13, для представления отрица-
тельных чисел можно использовать дополнения до 2. В этом
случае в двоичном формате все 8-разрядные отрицательные
числа начинаются с 1. В шестнадцатеричном формате двузнач-
ные числа со знаком являются отрицательными, если они на-
чинаются с 8, 9, A, B, C, D или F, поскольку в двоичном пред-
ставлении все эти цифры начинаются с 1. Например, число 99h
227
Байты и шестнадцатеричные числа
в десятичном формате может означать 153 (если вы знаете, что
имеете дело с однобайтовым беззнаковым числом) или –103
(если это число со знаком).
Вообще-то байт 99h может соответствовать и десятичному
числу 99! В этом что-то есть, а? Но как это согласуется со всем
тем, что вы до сих пор узнали? На этот вопрос я отвечу в главе
23, а пока поговорим о памяти.
|