Москва 2001 г тайный язык информатики Чарльз Петцольд ббк 32. 973. 26–018



Pdf көрінісі
бет11/26
Дата07.04.2020
өлшемі3,29 Mb.
#61783
1   ...   7   8   9   10   11   12   13   14   ...   26
Байланысты:
Petcold Kod-Taynyy-yazyk-informatiki.535358

Глава 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 +

´ 1000h +



´ 100h +


´ 10h +


´ 1h


Переписываем это выражение с помощью степеней числа 16:

223

Байты и шестнадцатеричные числа

9A48Ch = 9 

´ 16

4

 +



´ 16


3

 +



´ 16

2

 +



´ 16


1

 +



´ 16

0

или их десятичных значений:



9A48Ch = 9 

´ 65 536 +

´ 4 096 +



´ 256 +


´ 16 +


´ 1


Заметьте, что при записи одиночных цифр (9, A, 4, 8, C) нет

нужды указывать в индексе систему счисления. 9 всегда 9 не-

зависимо от того, десятичная или шестнадцатеричная система

счисления использована. С другой стороны, А очевидно явля-

ется шестнадцатеричной цифрой, эквивалентной числу 10 в

десятичной системе.

Чтобы завершить вычисление, все шестнадцатеричные

цифры нужно заменить их десятичными значениями:

9A48Ch = 9 

´ 65 536 +

10 

´ 4 096 +



´ 256 +


´ 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, а пока поговорим о памяти.





Достарыңызбен бөлісу:
1   ...   7   8   9   10   11   12   13   14   ...   26




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет