Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Архитектура вычислительных систем и Ассемблер с приложением методических указаний к лабораторным работам. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
2.4. Двоичное представление беззнаковых целых чисел 61
Соответствие двоичных триад восьмеричным цифрам
Таблица 2.3
bin 000 001 010 011 100 101 110 111 oct
01234567
Шестнадцатеричное представление натуральных чисел
Аналогично предыдущему разделу, для перевода из двоичной системы в шест­надцатеричную двоичные разряды необходимо группировать по четыре, так как
16 = 24:
X =
(xk...x1x0)2=
4i+1
· 2
· 2+x
· 2+x
3
· 24+ x25+ x26+ x2
+ x
4

+ x
4i+2
4i+2
· 2
4i+2
· 22+ x
· 4+x
4i+2
+ x
4i+3
· 23) · 24i+ ... =
4i+3
· 8) · 16i+ ... =
4i+3
· 2
= x
+ x1· 2+x2· 22+ x3· 2
0

+ ...+ x
=(x
0
=(x
+ ...+(x
· 24i+ x
4i

4i+1
+ x1· 2+x2· 22+ x3· 23)+(x4+ x5· 2+x6· 22+ x7· 23) · 24+
+ x
4i
4i+1
+ x1· 2+x2· 4+x3· 8) + (x4+ x5· 2+x6· 4+x7· 8) · 16+
0
+ ...+(x
= x
+ x
4i
4i+1
+ x1· 16 + ...+ xi· 16i, xi∈{0, 1, 2,...F}
0
4i+3
7
+ ...=
+
(2.35)
четыре двоичных разряда (тетрада) заменяются одним шестнадцатеричным (табли­ца 2.4)
1101010
= 0110 10102=6A
2
16
(2.36)
и наоборот
2B3
= 0010 1011 00112= 001010110011
16
2
(2.37)
Соответствие двоичных тетрад шестнадцатеричным
цифрам
Таблица 2.4
bin 0000 0001 0010 0011 0100 0101 0110 0111 hex
01234567
bin 1000 1001 1010 1011 1100 1101 1110 1111 hex
89ABCDEF
Шестнадцатеричное представление используется чаще, так как типичный байт (восемь бит) представляется двумя шестнадцатеричными цифрами. Часто двоич­ный код разделяют на тетрады просто для читабельности.
62 Глава 2. Представление данных
Так как восьмеричная и шестнадцатеричная системы счисления обычно исполь­зуются для более компактной записи двоичного кода (содержимого памяти, в ко­тором не используются нецифровые символы), а не как самостоятельные позицион­ные системы, они традиционно применяются только для беззнаковых целых чисел. Для более сложных структур данных под шестнадцатеричным представлением под­разумевается шестнадцатеричное представление двоичного содержимого памяти, а не самих данных. Так, запись ставляется в памяти двоичным кодом
1=FFFF FFFF 1111 1111 1111 1111 1111 1111 1111 1111
обозначает, что значение−1пред-
что в шестнадцатеричном виде соответствует FFFF FFFF.
В частности, функции форматированного ввода-вывода стандартной библио-
теки C++ (семейства
scanfиprintf
) предоставляют два спецификатора для
десятичного представления — десятичное знаковое%dи десятичное беззнаковое %u, но шестнадцатеричное представление возможно только беззнаковое.
2.4.2. Беззнаковая арифметика в вычислительных системах
Митрофан (вычисляя, шепчет). Единожды ноль — ноль. Единожды ноль — ноль. Нуль да нуль — нуль. Один да один... (Задумался.)
Д. И. Фонвизин. Недоросль
Из-за единообразного представления чисел в позиционных системах счисления арифметические действия во всех таких системах выполняется по одному и тому же алгоритму. Соответственно, сложение, вычитание, умножение и деление нату­ральных чисел, записанных в двоичной системе, выполняется по привычной нам схеме «в столбик», с одним отличием: 1+1=10.
Арифметика в вычислительных системах имеет ещё одно отличие от ручных вычислений, кроме основания системы счисления — ограниченность. Производя вычисления вручную, можно потенциально обрабатывать сколь угодно большие числа. Узел ЭВМ, предназначенный для выполнения арифметических действий, имеет фиксированную разрядность. В частности,N-разрядный сумматор — узел, выполняющий сложение — обрабатывает операнды, состоящие изNразрядов
N
и формирует результат также длины
; и возможна ситуация, когда операнды арифметической операции попадают в допустимый диапазон, а её результат — уже нет.
Большинство современных процессоров семейства x86 имеет наборы команд
для
N =810, N =1610,
N =3210и
N =6410. Для наглядности все арифметиче-
ские операции будут рассматриваться на примере N =810.
,
2.4. Двоичное представление беззнаковых целых чисел 63
Сложение и вычитание
Сложение производится поразрядно, начиная с младшего разряда. Если сумма
младших разрядов равна или превышает10, возникает
перенос в старший разряд.
Рассмотрим сложение двух чисел, представленных в двоичном виде. При сло-
жении младших разрядов получаем
1+1=10
, то есть младший разряд суммы равен0, а к более старшему разряду добавляется единица переноса (перенос по­казан мелким шрифтом над первым слагаемым). Соответственно, для второго разряда получаем уже
1+1+1 = 11
— единица в соответствующем разряде
суммы и единица переноса — и так далее:
11
1010011
+
1011
(8310+1110=9410) (2.38)
1011110
В скобках показано десятичное представление слагаемых и суммы.
Как уже было сказано, одной из особенностей арифметики вычислительных
систем является ограниченный диапазон представимых чисел. Все операции в ЭВМ выполняется над числами фиксированной длины N (в данном разделе рассматри- вается случай N =8
).
10
В этом случае пример (2.38) корректнее было бы записать в виде:
11
01010011
+
00001011
(8310+1110=9410) (2.39)
01011110
так как ни один из разрядов числа не может быть пуст. Но такая запись тяжело читается, поэтому незначащие нули часто опускают.
Пусть необходимо прибавить к максимальному представимому числу (для восьми разрядов это гаемых даст ноль в младшем разряде и единицу переноса (
1111 1111 = 25510) единицу. Сумма младших разрядов сла-
1+1 = 10
); сумма единицы переноса и вторых разрядов слагаемых — ноль во втором разряде и еди­ницу переноса (
1+1+0=10
) и так далее. Сумма старших (восьмых) разрядов тоже также даст ноль в старшем (восьмом) разряде результата и единицу переноса в девятый разряд результата (
1+1+0 = 10
), так что в неограниченной арифметике
(в частности, при ручном расчёте) получилось бы:
11111111
11111111
+
(25510+110= 25610) (2.40)
1
100000000
64 Глава 2. Представление данных
но у восьмибитного результата нет девятого разряда — поэтому фактический ре­зультат будет равен нулю. Такая ситуация называется
Бит переноса в несуществующий разряд результата сохраняется в специальной
ем.
беззнаковым переполнени-
ячейке, называемой флагом переноса (CF — Carry flag).
11111111
11111111
+
(25510+110=010) CF =1 (2.41)
1
00000000
N
В общем случае в N-битной арифметике (2
1) + 1 = 0, при этом CF =1.
Флаг переноса не является частью числа, куда записывается результат. Кон-
CF
структивно ячейка несколько операций, каждая из них будет перезаписывать
принадлежит сумматору и, если подряд выполняется
CF
новым значени-
ем.
Если размер суммы не превышаетNразрядов, всё делается аналогично неогра-
ниченной арифметике и флаг переноса CF равен нулю.
111
01010011
+
01001011
(8310+7510= 15810) CF =0 (2.42)
10011110
Одного разряда для флага переноса достаточно. Даже при сложении двух максимально возможных восьмибитных беззнаковых значений возникает перенос в девятый, но не в десятый разряд:
11111111
11111111
+
11111111
(25510+ 25510= 25410) CF =1 (2.43)
11111110
Таким образом, в ЭВМ реализована циклическая двоичная арифметика: при сложении операндов
N
b)mod2
. Программист может определить корректность результата, анализи-
aиb
разрядностиNрезультат фактически равен
руя флаг переноса из старшего разряда CF.
Вычитание выполняется, как и сложение, поразрядно. При необходимости выполняется заём из старшего разряда:

1000011
1001
(6710− 910=5810) (2.44)
111010
(a +
2.4. Двоичное представление беззнаковых целых чисел 65
В случае, когда уменьшаемое меньше вычитаемого, возможен заём из несуществу­ющего девятого разряда. Такая ситуация также отмечается единичным значением флага переноса CF:
 
00001001
01000011
(910− 6710= 19810) CF =1 (2.45)
11000110
Как можно заметить, в неограниченной арифметике 58
+ 19810= 25610.
10
Таким образом, вычитание, реализованное в ЭВМ, также циклическое: разность
aиb
разрядностиNравна
вычитание в неограниченной арифметике. Здесь остаток
(a b)mod2N, где под знаком «−» подразумевается
(a b)mod2Nвсегда
неотрицателен (то есть вычисляется по правилам математики, а не C++). Коррект­ность результата можно определить, анализируя флагCF, показывающий также заём в старший разряд.
В частности,

00000000
(010− 110= 25510) CF =1 (2.46)
1
11111111
Циклическое сложение (сложение по модулю и ассоциативно (
a +(b + c)=(a + b)+c
2N) коммутативно (
a + b = b + a
). Циклическое вычитание связано с ним так же, как и обычное вычитание с обычным (неограниченным) сложением. Таким образом, циклическое вычитание антикоммутативно (
a b = (b a)
) и требует
смены знаков при раскрытии скобок (a − (b c)=(a b)+c).
Умножение и деление
При умножении двух чисел первый множитель последовательно умножается на каждый разряд второго множителя и сдвигается влево на соответствующее количество разрядов (что соответствует умножению на10, то есть на два). Затем результаты складываются:
)
1010011
×
1011
1010011
1010011
0000000
1010011 1110010001
(83
· 1110= 91310) (2.47)
10
66 Глава 2. Представление данных
Как видно из
(2.47)
, разрядность произведения может превысить разрядность
множителей более чем на один бит. Поэтому большинство команд умножения
N
процессоров семейства x86, работающие с операндами размера
, возвращают
результат размера 2N .
Действительно, рассмотрим умножение двух максимально возможных восьми­битных беззнаковых значений.
1111 1111
×
1234 5677 6543 21
1111 1111
1111 1111
11111111
11 1111 11
111 1111 1
· 25510= 6502510) (2.48)
(255
10
1111 1111
1 1111 111
11 1111 11
111 1111 1
1111 1110 0000 0001
В умножении столбиком, как правило, переносы между разрядами не записы­ваются, а запоминаются, но в данном примере ввиду его громоздкости перенос показан мелким шрифтом в следующей строке после множителей. Для наглядности столбцы, соответствующие тетрадам произведения, отделены пробелами.
Таким образом, для произведения двух восьмибитных множителей достаточно шестнадцати разрядов.
Беззнаковое умножение ассоциативно ( (
a · b = b · a
), как и сложение, так что циклическую беззнаковую арифметику
a · (b · c)=(a · b) · c
) и коммутативно
в целом можно назвать ассоциативной и коммутативной.
Деление также выполняется по классической схеме:
1010011 1011
0000 0111 10100
1011 10011
1011 10001
1011
110
(8310/1110=710и 610в остатке) (2.49)
2.5. Представление отрицательных чисел 67
обычно при ручном счёте нулевые вычитаемые опускают:
1010011 1011
1011 111 10011
1011 10001
1011
(8310/1110=710и 610в остатке) (2.50)
110
Так как деление обратно умножению, большинство команд деления процессоров семейства x86 для делителя и частного размераNиспользуют делимое разме­ра 2N .
Деление неассоциативно и некоммутативно не только для беззнаковых целых, но и для вещественных чисел в целом.
2.5. Представление отрицательных чисел
Если вы уже открываете мне лицевой счёт, то хоть ведите его правильно. Заведите дебет, заведите кредит. В дебет не забудьте внести шестьдесят тысяч рублей, которые вы мне должны, а в кредит — жилет. Сальдо в мою пользу — пятьдесят девять тысяч девятьсот девяносто два рубля. Ещё можно жить.
Илья Ильф, Евгений Петров. Двенадцать стульев
Натуральный двоичный код позволяет кодировать только неотрицательные целые числа. При этом в некоторых задачах необходимы целые числа со знаком. В ячейках памяти нельзя непосредственно сохранить знак числа, так что знаковые и, в частности, отрицательные числа необходимо представить в виде комбинации нулей и единиц.
Рассмотрим различные способы кодирования знаковых чисел на восьми разря­дах. Всего в восьмиразрядную ячейку можно записать 256 различных комбинаций нулей и единиц. Каждой из этих комбинаций соответствует некоторое неотрица­тельное число u в натуральном двоичном коде.
Для кодирования знаковых чисел необходимо поставить в соответствие каждой комбинации новое число (декодированное значениеx), причём около половины из этих чисел должны быть отрицательными. Это можно сделать различными способами.
К представлению знаковых чисел можно сформулировать следующие пожела­ния:
68 Глава 2. Представление данных
код должен позволять представить с помощьюNбитов все целые числа некото-
рого диапазона
x [ν1,ν2]
. Представимый диапазон
[ν1,ν2]
должен включать
ноль и примерно равное количество положительных и отрицательных чисел;
представление неотрицательных чисел должно совпадать с их натуральным
двоичным кодом;
должен существовать простой способ различения положительных и отрицатель-
ных чисел;
сложение и вычитание должно выполняться с помощью того же сумматора, что
и сложение и вычитание неотрицательных чисел.
Три наиболее известных способа представления знаковых чисел на примере восьми разрядов представлены в таблицах 2.5 и 2.6.
Таблица 2.5 показывает кодирование знаковых чиселxразличными способами. Первый столбец содержит десятичное представление знакового числаx, следую­щая группа из трёх столбцов показывает двоичный кодxв виде величины со знаком, шестнадцатеричное представление этого кода, а также десятичное представле­ние кода (так как это представление кода, а не самого числаx, оно беззнаковое).
Аналогично, следующая группа из трёх столбцов содержит код с избытком (пред-
ставлен избыток 128) и его шестнадцатеричное и десятичное представления, третья группа — дополнительный код.
Таблица 2.6 показывает декодирование беззнакового кодаu. Первые три столб­ца содержат кодuв десятичном, шестнадцатеричном и двоичном виде, четвёр­тый — значение, получаемое при декодировании
u
как величины со знаком, пя­тый — при декодировании как кода с избытком 128, шестой — как дополнительно­го кода.
Для кодирования целых знаковых чисел как самостоятельных величин в ЭВМ используется дополнительный код, соответствующих всем перечисленным вы­ше критериям. Представление в виде величины со знаком или кода с избытком используются в кодировании компонент вещественных чисел.
2.5.1. Величина со знаком
Прискульптурив
из Лассаля
бороду на подбородок,
сделает Калинина.
В. В. Маяковский. Халтурщик
Наиболее очевидный способ кодирования чисел со знаком — выделить один бит (обычно старший) для хранения знака, а в оставшихся хранить абсолютную величину (модуль) числа (столбец «Величина со знаком» таблицы 2.6). Такой код легко читается человеком и для неотрицательных чисел совпадает с натураль­ным. Код в виде величины со знаком изNразрядов позволяет представить числа
2.5. Представление отрицательных чисел 69
Различные способы представления знаковых чисел
(кодирование)
Таблица 2.5
Значение Код u
Величина Код
x
10
со знаком с избытком 128
u
u16u
2
10
u
u16u
2
Дополнительный код
(дополнение до 2)
10
u
2
u16u
10
128 отсутствует 0000 0000 00 0 1000 0000 80 128
127
126
125
124
123
1111 1111 FF 255 0000 0001 01 1 1000 0001 81 129 1111 1110 FE 254 0000 0010 02 2 1000 0010 82 130 1111 1101 FD 253 0000 0011 03 3 1000 0011 83 131 1111 1100 FC 252 0000 0100 04 4 1000 0100 84 132 1111 1011 FB 251 0000 0101 05 5 1000 0101 85 133
...
4
3
2
1
0
... ... ... ... ... ... ... ... ...
1000 0100 84 132 0111 1100 7C 124 1111 1100 FC 252 1000 0011 83 131 0111 1101 7D 125 1111 1101 FD 253 1000 0010 82 130 0111 1110 7E 126 1111 1110 FE 254 1000 0001 81 129 0111 1111 7F 127 1111 1111 FF 255 1000 0000 80 128 0000 0000 00 0
1000 0000 80 128 0000 0000 00 0
+1 0000 0001 01 1 1000 0001 81 129 0000 0001 01 1
0000 0010 02 2 1000 0010 82 130 0000 0010 02 2
+2
0000 0011 03 3 1000 0011 83 131 0000 0011 03 3
+3
0000 0100 04 4 1000 0100 84 132 0000 0100 04 4
+4
...
+121 +122 +123 +124 +125 +126 +127
... ... ... ... ... ... ... ... ...
0111 1001 79 121 1111 1001 F9 249 0111 1001 79 121 0111 1010 7A 122 1111 1010 FA 250 0111 1010 7A 122 0111 1011 7B 123 1111 1011 FB 251 0111 1011 7B 123 0111 1100 7C 124 1111 1100 FC 252 0111 1100 7C 124 0111 1101 7D 125 1111 1101 FD 253 0111 1101 7D 125 0111 1110 7E 126 1111 1110 FE 254 0111 1110 7E 126 0111 1111 7F 127 1111 1111 FF 255 0111 1111 7F 127
70 Глава 2. Представление данных
Различные способы представления знаковых чисел
(декодирование)
Таблица 2.6
Код u Декодированное значение x
u10u
16
u
2
Величина
со знаком
Код
с избытком 128
Дополнительный код
(дополнение до 2)
0 00 0000 0000 +0 128 0 1 01 0000 0001 2 02 0000 0010 3 03 0000 0011 4 04 0000 0100 5 05 0000 0101 6 06 0000 0110
... ... ...
123 7B 0111 1011 124 7C 0111 1100 125 7D 0111 1101 126 7E 0111 1110 127 7F 0111 1111
+1 127 +1 +2 126 +2 +3 125 +3 +4 124 +4 +5 123 +5 +6 122 +6
... ... ...
+123 −5 +123 +124 −4 +124 +125 −3 +125 +126 −2 +126
+127 −1 +127 128 80 1000 0000 00 128 129 81 1000 0001 130 82 1000 0010 131 83 1000 0011 132 84 1000 0100
... ... ...
249 F9 1111 1001 250 FA 1111 1010 251 FB 1111 1011 252 FC 1111 1100 253 FD 1111 1101 254 FE 1111 1110 255 FF 1111 1111
1+1 127
2+2 126
3+3 125
4+4 124
... ... ...
121 +121 7
122 +122 6
123 +123 5
124 +124 4
125 +125 3
126 +126 2
127 +127 1
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]