Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Архитектура вычислительных систем и Ассемблер с приложением методических указаний к лабораторным работам. Учебное пособие
.pdf
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+ x5· 25+ x6· 26+ x7· 2
+ 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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
