Кодирование чисел и выполнение арифметических операций в

advertisement
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
Факультет прикладной математики - процессов управления
И. А. МОИСЕЕВ
КОДИРОВАНИЕ ЧИСЕЛ И ВЫПОЛНЕНИЕ
АРИФМЕТИЧЕСКИХ ОПЕРАЦИЙ В
КОМПЬЮТЕРЕ
Учебно-методическое пособие
Санкт-Петербург
2016
Рекомендовано учебно-методической комиссией факультета прикладной математики-процессов управления Санкт-Петербургского государственного университета для размещения на сайте
факультета
И. А. Моисеев
КОДИРОВАНИЕ ЧИСЕЛ И ВЫПОЛНЕНИЕ
АРИФМЕТИЧЕСКИХ ОПЕРАЦИЙ В КОМПЬЮТЕРАХ.
Учебно-методическое пособие 2016, 28 с.
В предлагаемом пособии рассматриваются вопросы, связанные с использованием в компьютерах различных систем счисления. Наиболее подробно рассмотрены двоичная и двоично-десятичная системы: алгоритмы переводы из десятичной системы в
двоичную и обратно и использование двоично-десятичной системы для ввода числовой информации в компьютер. Большое
внимание уделено выполнении арифметических операций с двоичными числами, с фиксированной и с плавающей точкой, а так
же и с двоично-десятичными числами.
Пособие предназначено для студентов, специализирующихся в области информационных технологий и систем.
Библиогр. 5 назв.
© И. А. Моисеев, 2016
© Факультет прикладной математики–процессов управления, 2016
§ 1. Системы счисления, используемые в современных ЭВМ,
представление и перевод чисел из одной системы счисления
в другую
В вычислительных системах арифметические действия производятся над числами, представленными в виде специальных кодов, в принятой для данной машины системе счисления, под которой имеют ввиду способ наименования и изображения чисел с помощью символов, имеющих определенные количественные значения, т.е. цифр. Позиционной называется такая система счисления,
в которой количественное значение каждой цифры зависит от ее
места (позиции) в записи числа. В такой системе счисления любое
число
записывается
в
виде
последовательности
цифр:
A = ± am−1am−2 … ak … a1a0a−1 … a−l . Позиции, пронумерованные индексами, называются разрядами числа. Сумма m + l определяет
количество разрядов числа, m — число разрядов целой, а l —
число разрядов дробной части. Каждая цифра в записанной последовательности может принимать одно из некоторого количества
N возможных значений, т.е. N −1 ≥ ak ≥ 0. Количество N различ-
ных цифр, используемых для изображения чисел в позиционной
системе счисления, называется основанием системы счисления.
Заметим, что в позиционной системе счисления любое число
можно представить в виде суммы:
A = ±[am−1 N m−1 + am−2 N m−2 + … + a1 N 1 + a0 N 0 + a−1 N −1 + … a−l N −l ].
Основание N позиционной системы счисления определяет
ее название. Исторически так сложилось, что общепринятой оказалась десятичная система. В вычислительной технике чаще используются другие системы счисления (двоичная, шестнадцатеричная
с основаниями соответственно два и шестнадцать). Для записи чисел в двоичной системе счисления используются цифры 0 и 1, в
3
шестнадцатеричной 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, А, В, С, D, Е, F. Следует заметить, что все современные процессоры могут выполнять
арифметические операции и в десятичной системе счисления. Ранее широко использовалась восьмеричная система счисления.
В любой вычислительной системе наиболее просто реализуются процессы выполнения арифметических и логических операций над числами, представленными в двоичной системе счисления. Объясняется это тем, что во-первых, для представления двоичных чисел в машинах можно использовать достаточно простые
и надежные электронные элементы, имеющие лишь два устойчивых состояния (триггеры). Одно из таких состояний принимается
соответствующим коду 1, другое — 0. Во-вторых, в двоичной системе счисления просто выполняются арифметические и логические операции над числами. Основное неудобство заключается в
необходимости перевода данных, из общепринятой десятичной
системы, в двоичную систему счисления. При переводе смешанное число разбивается на целую и дробную части. Перевод целой
часть производится путем последовательного деления целой части
и образующихся целых частных на основание новой системы
счисления, до получения в частном единицы. При переводе целой
части, полученные в результате процесса последовательного деления, остатки (единица или ноль) являются цифрами младших разрядов целой части числа в новой системе счисления. Последний
остаток (последнее частное равное 1) является старшей цифрой
переведенного числа. При переводе дробной части производится
последовательное умножение дробной части исходного числа и
дробных частей получившихся произведений. При переводе дробной части числа целые части, получающиеся при каждом умножении, не участвуют в последующих умножениях. Эти целые
части (единица или ноль) представляют собой цифры дробной
4
части исходного числа в новой системе. Значение первой целой
части является первой цифрой после запятой переведенного числа.
Рассмотрим следующий пример:
Пусть требуется перевести в двоичную систему десятичное
число 35,8125. Переводим целую часть числа:
35 = 17 × 2 + 1, ⎡⎣1⎤⎦
17 = 8 × 2 + 1, ⎡⎣1⎤⎦
8 = 4 × 2 + 0, ⎡⎣0⎤⎦
4 = 2 × 2 + 0, ⎡⎣0⎤⎦
2 = ⎡⎣1⎤⎦ × 2 + 0, ⎡⎣0⎤⎦ .
Таким образом, 35 2 ⇒ 100011 . Теперь переведем дробную
часть числа:
0.8125 × 2 = ⎡⎣1⎤⎦ .625, ⎡⎣1⎤⎦
0.625 × 2 = ⎡⎣1⎤⎦ .25, ⎡⎣1⎤⎦
0.25 × 2 = 0.5, ⎡⎣0⎤⎦
0.5 × 2 = ⎡⎣1⎤⎦ .0.
Окончательный результат 35.81252 ⇒ 100011.1101. Проверим
правильность перевода:
100011.1101 ⇒ 1× 25 + 0 × 24 + 0 × 23 + 0 × 22 + 1× 21 + 1× 20 + +1× 2−1 +
+1× 2−2 + 0 × 2−1 + 1× 2−4 = 32 + 2 + 1 + 0.5 + 0.25 + 0.0625 = 35.8125.
Рассмотренный алгоритм перевода несложен, но у
него есть один, но очень серьезный недостаток — десятичные числа надо предварительно ввести в компьютер. Практически перевод десятичного числа в двоичное и обратно
осуществляется при операциях ввода-вывода такого числа и
для этого используется для этого двоично-десятичная система. В двоично-десятичной записи каждая цифра десятичного
числа заменяется четырехразрядным (тетрадой) двоичным кодом
этой цифры. Например, десятичное число 375,875 в двоично-деся3
7
5
8
7
5
тичной записи имеет вид: 0011 0111 0101,1000 0111 0101. Перевод
5
целой и дробной части двоично-десятичного кода в двоичный
также осуществляется раздельно. Любое десятичное число можно
представить в следующем виде:
A = am−110m−1 + am−210m−2 + … + a1101 + a0 + a−110−1 + … a−l 10−l =
= ((...(am−110 + am−2 ) ×10...) ×10 + a2 ) ×10 + a1 ) ×10 + a0 + 10−1 ×
×(a−1 + 10−1 × (a−2 + 10−1 × (... + 10−1 × (a− l −1 + a−l 10−1 )...)).
( )
Рассмотрим
алгоритм
перевода
числа
375.875
в
двоичную систему. Сначала вычислим произведение старшего
разряда am −1 , точнее представляющей его тетраде, на 1010
(основание десятичной системы счисления, записанное в двоичном коде) и прибавляют следующую цифру am− 2 (тетраду).
Полученную сумму также умножают на 1010 и к полученному
произведению прибавляют следующую тетраду и так до последнего сложения тетрадой, представляющей a0 [2, 3].
375 = 3 ×102 + 7 ×101 + 5 = ( 3×10 + 7 ) ×10 + 5 ⇒ ( 0011×1010 + 0111) ×
×1010 + 0101 = (10100 + 1010 + 0111) ×1010 + 0101 = 100101×1010 +
+0101 = 1001010 + 100101000 + 0101 = 101110111.
Проверим правильность перевода
101110111 ⇒ 1× 28 + 0 × 27 + 1× 26 + 1× 25 + 1× 24 + 0 × 23
+1× 22 + 1× 21 + 1 = 256 + 64 + 32 + 16 + 4 + 2 + 1 = 375.
Теперь переведем дробную часть
10−1 (8 + 10−1 (7 + 5 ×10−1)) = 1010−1 (1000 + 1010−1 (0111 + 0101×1010−1 ) =
= 1010−1 (1000 + 1010−1 (0111 + 0.1) = 1010−1 (1000 + 1010−1 × 0111.1) =
= 1010−1 (1000 + 1010−1 × 0111.1) = 1010−1 (1000 + 0.11) = 1010−11000.11 =
= 1010−11000.11 = 0.111.
Проверка дает следующий результат
0.111 = 0.5 + 0.25 + 0.125 = 0.875.
6
Таким образом 375.875=101110111.111. Следует заметить, что
все действия выполняются в двоичной системе счисления, причем
аппаратно.
Достаточно широко используется шестнадцатеричная система счисления. Она позволяет делать еще более компактные записи двоичных кодов, что очень важно, поскольку диапазоны разрядности чисел, команд и специальных двоичных слов, которыми
оперируют эти компьютеры, существенно увеличились. Кроме
того, в качестве основной единицы информации используется
восьмиразрядный двоичный код — байт. Переменные разрядности
чисел и команд устанавливаются кратными байту. Двоичные коды
байтов удобно представляются двухразрядными шестнадцатеричными числами. Поэтому при подготовке к вводу в эти компьютеры программ, различных специальных слов и при печати выдаваемой информации, не переводимой в десятичную систему, используется шестнадцатеричная система счисления. При переводе в
шестнадцатеричную систему счисления двоичные числа разбиваются влево и вправо от запятой на тетрады, а при обратном переводе каждая шестнадцатеричная цифра заменяется двоичной тетA
C
7
F
радой. Например, двоичному числу 10101100 01111111 соответствует шестнадцатеричное число AC7F и наоборот [1]. Кроме того, в
различных языках программирования используются арифметические операции над шестнадцатеричными цифрами.
§ 2. Кодирование чисел в компьютере
При кодирования знаков двоичных чисел используются дополнительно вводимые разряды, называемые знаковыми, в которых знак "плюс" изображается цифрой 0, а знак "минус" — цифрой 1. Код знака обычно располагается перед кодом числа слева.
Если пронумеровать двоичные позиции сетки машины слева на7
право, начиная с нуля, до n − 1 , то знаковому разряду будет соответствовать нулевая позиция. При естественной форме представления чисел, по величине меньших единицы, сразу за знаковым
разрядом (вправо от запятой) следуют старшие разряды мантиссы.
Такое представление числа со знаком называется прямым кодом.
В этом коде значащая часть в виде абсолютного значения двоичного числа и код знака помещается в соответствующие позиции
разрядной сетки [1, 4, 5]. Например, если A = +0.100111 , то
Aпр = 0*.100111. 1 Если A = −0.100111 , то Aпр = 1*.100111. Анало-
гично и для целых чисел. Если B = +1010, то Bпр = 0*1010, а если
B = −1010, то Bпр = 1*1010. Прямой код используется для пред-
ставления положительных двоичных чисел при выполнении операций в арифметических устройствах, для хранения положительных и отрицательных чисел в ЗУ (запоминающих устройствах) и
устройствах ввода-вывода. Для представления отрицательных чисел при выполнении операций в арифметических устройствах
прямой код обычно не применяется. Это связано с тем, что в целях
упрощения конструкций арифметико-логических устройств (АЛУ)
вычислительных машинах арифметические операции, как правило, сводятся к сложению (операция вычитания) или к сериям
сложений (вычитаний) и сдвигов (операции умножения и деления). Для этой цели отрицательные двоичные числа в арифметических устройствах представляются в так называемом дополнительном или обратном коде. Для образования дополнительного кода
отрицательного двоичного числа нужно в знаковом разряде поставить единицу, во всех цифровых разрядах единицы заменить нулями, а нули — единицами, и к младшему разряду прибавить единицу и проделать циклический перенос (если это требуется). Для
1
Далее для отделения знака числа используется символ *
8
образования обратного кода отрицательного двоичного числа необходимо в знаковом разряде поставить единицу, в цифровых же
разрядах единицы заменить нулями, а нули — единицами.
Обратный перевод из дополнительного (обратного) кода в прямой
проводится по тем же самым правилам. При сложении чисел
меньших единицы в машине могут получаться числа по абсолютной величине большие единицы. Выход результата операции за
допустимые пределы представления чисел приведет к ошибкам в
последующих вычислениях, если не принять надлежащие меры.
Поэтому случаи переполнения должны немедленно обнаруживаться. Для этого в компьютерах применяют так называемые модифицированные коды, которые отличаются от рассмотренных
выше простых кодов тем, что знаки чисел изображаются не одним
разрядом, а двумя. Например, для A = -0.1010 модифицированные
м
м
м
коды будут иметь вид Aпр
= 11*.1010, Aобр
= 11*.0101, Aдоп
= 11*.0110.
Сложение чисел в модифицированных кодах производится так же,
как и в обычных. Переносы между знаковыми разрядами учитываются точно так же, как и переносы из старшего цифрового разряда в знаковый. При корректно выполненной операции в знаковых разрядах присутствуют комбинации цифр 00 или 11. Признаком переполнения разрядной сетки в модифицированных кодах
служит появление в знаковых разрядах суммы цифр 01 при сложении положительных чисел (положительное переполнение), либо
10 при сложении отрицательных чисел (отрицательное переполнение). Старший знаковый разряд при переполнении соответствует
действительному знаку числа и его часто называют просто знаковым. Младший знаковый разряд при переполнении принимает
значение, противоположное знаку числа и указывая на наличие
переполнения, поэтому его часто называют разрядом переполнения
9
Переполнение можно фиксировать не вводя специального
разряда переполнения. В этом случае необходимо регистрировать
переносы из знакового разряда и из старшего значащего (цифрового, расположенного правее знакового). Если при сложении кодов эти переносы отсутствуют или возникают оба вместе, то переполнения нет. В противном случае, если возникает перенос только
из старшего значащего разряда или только из знакового (переносы
не согласуются), то имеет место переполнение [1].
§ 3. Выполнение процессором операций сложения и
вычитания
Рассмотрим выполнение операции сложения двух правильных дробей, в прямом и модифицированном прямом кодах (операции сложения и вычитания над целыми числами производятся
аналогично). Пусть A = 0.1000111, B = 0.01101. Операнды имеют
разную длину, поэтому более короткий операнд дополняется
нулями справа (при целочисленных операндах — дополняется
слева), т.е. проводится выравнивание длин операндов. Тогда
Aпр = 0*.1000111, Bпр = 0*.0110100. Выполним сложение
0*.
+ 0*.
0*.
1
0
1
0
1
1
0
1
1
0
0
1
1
1
0
1
0
1
1
0
1.
Модифицированные коды этих операндов имеют вид
Aпр = 00*.1000111, Bпр = 00*.0110100, а операция сложения дает
следующий результат
0
+ 0
0
0*.
0*.
0*.
1
0
1
0
1
1
0
1
1
0
0
1
1
1
0
1
0
1
1
0
1.
Пусть первый операнд A = 0.1010111, Aпр = 00*.1010111, тогда
0
+ 0
0*.
0*.
1
0
0
1
1
1
10
0
0
1
1
1
0
1
0
0
1*.
0
0
0
1
0
1
1.
Понятно, что в данном случае имеет место переполнение.
Операция вычитания в вычислительных машинах заменяется сложением. Поясним это на следующем примере. Пусть требуется найти разность чисел 31-28 (числа заданы в десятичной
системе счисления). Второе число двухразрядное, поэтому вычислим
его
дополнение
102 :100 − 28 = 72.
до
Далее
найдем
сумму 31+72= 1 03 . Исходные операнды двухразрядные и перенос
из старшего числового разряда означает что результат вычитания
положителен, т.е. +3. Теперь рассмотрим вычисление разности 2831. В этом случае дополнение вычитаемого равно 100 − 31 = 69. Тогда 28+69=97. Перенос из старшего числового разряда отсутствует, а это означает, что результат отрицателен и представлен в
виде дополнения -3 до 100. Ни в коем случае не претендуя на
строгость рассуждений, данный пример показывает, как операция
вычитания сводится к сложению. Нижем рассмотрим операцию
вычитания операндов, сумму которых мы рассматривали в первом
примере. Итак, требуется найти разность A − B. Найдем модифицированный дополнительный код вычитаемого Bдоп = 11*.1001100,
и вычислим сумму
0
+ 1
1← 0
0*.
1*.
0*.
1
1
0
0
0
0
0
0
1
0
1
0
1
1
0
1
0
1
1
0
1.
Перенос из старшего знакового разряда говорит о положительном
результате, полученном в прямом коде. Проверим так ли это на
самом деле.
0
+ 0
0
0*.
0*.
0*.
0
0
1
1
0
0
1
1
0
0
0
0
1
0
1
0
1
1
0
1
1.
Действительно, мы получили прямой код операнда A. Теперь вы11
числим разность B − A. Дополнительный модифицированный код
Aдоп = 11*.0111001, а разность
0
+ 1
1
0*.
1*.
1*.
0
0
1
1
1
1
1
1
0
0
1
1
1
0
1
0
0
0
0
1
1.
Перенос из старшего знакового разряда отсутствует, т.е. результат получен в дополнительном коде. Проверим корректность
проделанных вычислений. Разность ( B − A) = −0.0010011 . Переведем это число в двоичную систему
1
1
16 + 2 + 1
19
+
=−
.
( B − A) = −0.0010011 ⇒ − ⎜ 18 + 64
⎟=−
128
128
128
⎛
⎞
⎝
⎠
С другой стороны
1 1 1
1 64 + 4 + 2 + 1 71
=
=
,
A = 0.1000111 ⇒ + + +
2 32 64 128
128
128
1 1 1 8 + 4 + 1 13
= ,
B = 0.01101 ⇒ + + =
4 8 32
32
32
13 71 52 − 71
19
B− A= −
=
=−
.
32 128
128
128
Далее рассмотрим вычисление разности с использованием обратных кодов чисел. Найдем Aобр = 11*.0111000, Bобр = 11*.1001011.
Сначала вычислим A − B .
0
+ 1
1← 0
→
↓
0
0*.
1*.
0*.
→
0*.
1
1
0
→
0
0
0
0
→
0
0
0
1
→
1
0
1
0
→
0
1
0
0
→
0
1
1
1
→
1
1
1
0
↑
1.
Перенос из старшего знакового разряда означает что результат положительный и единица Нетрудно заметить, что результат
совпадает с полученным в результате использования Bдоп . Теперь
вычислим B − A.
0
+ 1
1
0*.
1*.
1*.
0
0
1
1
1
1
12
1
1
0
0
1
1
1
0
1
0
0
0
0
0
0.
Результат получен в обратном коде, перевод в прямой даст
B − A = −0010011.
§ 4. Реализация операций умножения и деления
Теперь рассмотрим выполнение операций умножения и деления. При выполнении операции умножения цифровая часть
произведения получается как результат перемножения абсолютных величин сомножителей, представленных в прямом коде. Знак
произведения определяется путем суммирования по модулю два в
специальном одноразрядном сумматоре значений знаковых разрядов сомножителей. Так как при суммировании по модулю два
единица переноса теряется, то в результате получим, что
0 ⊕ 0=0,1⊕ 1=0,0 ⊕ 1=1,1⊕ 0=1,
т.е. при одинаковых знаках сомножителей результат положителен,
при различных — отрицателен. В конце операции умножения знак
результата заносится в знаковый разряд сумматора или регистра,
где находится цифровая часть полученного произведения. Прямой
код отрицательного произведения, если оно используется в следующей операции, выполняемой в АЛУ, автоматически преобразуется в дополнительный или обратный код в зависимости от того,
какой код принят в машине. Процесс перемножения цифровых
частей сомножителей очень похож на схему умножения "в столбик", но в силу того, что перемножаемые цифры 1 и 0, то он сводится к многократному сложению и сдвигам. множимого или
сумм частных произведений как влево, так и вправо. Сдвиги множителя влево происходят в случае, если умножение осуществляется начиная с младшего разряда множителя, вправо — со старшего разряда множителя. Сдвиги сумм частных произведений
вправо происходят в случае, если умножение осуществляется начиная с младшего разряда множителя, влево — со старшего раз13
ряда множителя. Произведение двух n- разрядных чисел содержит
2n разрядов. Ниже рассмотрим умножение следующих чисел
A = 0.11101, B = −0.10011. В примере будем производить сдвиг на
один разряд вправо сумм частных произведений [1]. Следует
также заметить, что для ускорения процессов умножения широко
используются схемы, в которых производится умножение одновременно на несколько разрядов множителя (на 2, 4, 6). Отметим,
что арифметические операции выполняются сумматором, входящим в состав АЛУ. Выпишем прямые коды сомножителей
Aпр = 00*.11101, Bпр = 00*.10011. Процесс умножения иллюстрируется следующей схемой.
Содержимое сумматора перед началом ∑
+
=
→
+
Сумма частных произведений ∑1
Сдвиг ∑1 на разряд вправо
Сумма частных произведений ∑2
Сдвиг ∑2 на разряд вправо
Сдвиг ∑2 на разряд вправо
Сдвиг ∑2 на разряд вправо
→
→
→
+
=
→
=
Сумма частных произведений ∑3
Сдвиг ∑3 на разряд вправо
Результат
Знак произведения 0⊕ 1=1
Окончательный результат
Разряды числа
00*.0000000000
00*.11101
00*.11101
00*.011101
00*.11101
01*.010111
00*.1010111
00*.01010111
00*.001010111
00*.11101
01*.000100111
00*.1000100111
00*.1000100111
Множитель
1
1
0
0
1
11*.1000100111
Проверим правильность результата.
1 1 1 1 16 + 8 + 4 + 1 29
A= + + + =
= 29,
2 4 8 32
32
32
19
1 1 1
16 + 2 + 1
B=− + + =−
=− .
32
2 16 32
32
AB = −
29 ⋅19 551
=
. Перевод в десятичную систему произведения
32 ⋅ 32 1024
1 1
1
1
1
−0.1000100111 ⇒ − + +
+
+
=
2 32 256 512 1024
512 + 32 + 4 + 2 + 1
551
=−
=−
1024
1024
дает тот же самый результат. Заметим, что в процессе выполнения
14
умножения возможно появления переполнения в промежуточных
результатах.
Теперь рассмотрим выполнение операции деления двоичных
чисел. И в этом случае есть много общего с делением в столбик
десятичных чисел. В компьютере деление сводится к последовательности операция вычитания (сложения) и сдвига. Точно так же
как и для умножения, для деления существуют различные алгоритмы выполнения операции. Ниже рассмотрим алгоритм деления
без восстановления остатка. Как и в других реализациях, в данном
алгоритме
производится деление абсолютных значений чисел
(цифровые части делимого и делителя представлены в прямом
коде). При этом знак частного определяется путем суммирования
по модулю два цифр, изображающих знаки делимого и делителя.
Как и при умножении, знак частного добавляется к цифровой
части в конце деления. Отличие от реализации деления с восстановлением остатка заключается в том, что при данном методе деления отрицательный остаток не восстанавливается. Для определения очередного разряда частного отрицательный остаток сдвигается на один разряд влево и к нему прибавляется делитель. Разряды частного определяются по следующему правилу: если полученная очередная разность положительна, то в соответствующий
разряд частного заносится 1, если отрицательна, то 0. Если числа
представляются правильными дробями, то при первом вычитании
делителя из делимого определяется значение целой части частного
(значение разряда слева от запятой).
Пусть
требуется
найти
частное
от
деления
числа
C = −0.1000100111 (произведение A и B из предыдущего примера)
на A. Отметим, что делитель должен быть всегда больше делимого. Найдем Aдоп = 11*.00011, Cпр = 00*.1000100111 и приступим к
делению.
15
Разряды частного
Делимое Cпр
Делитель Aдоп
Остаток R1<0
Сдвиг R1
Делитель Aпр
Остаток R2>0
Сдвиг R2
Делитель Aдоп
Остаток R3<0
Сдвиг R3
Делитель Aпр
Остаток R4>0
Сдвиг R4
Делитель Aпр
Остаток R5>0
Сдвиг R5
Делитель Aдоп
Остаток R6>0
Знак частного 1⊕ 0=1
Окончательный
результат
+
=
←
+
=
←
+
=
←
+
=
←
+
=
←
+
=
00*.1000100111
11*.0001100000
11*.1010000111
11*.0100001110
00*.1110100000
100*.0010101110
00*.0101011100
11*.0001100000
11*.0110111100
10*.1101111000
00*.1110100000
11*.1100011000
11*.1000110000
00*.1110100000
100*.0111010000
00*.1110100000
11*.0001100000
100*.0000000000
0.
1
0
0
1
1
11*.1001100000
Таким образом, результат соответствует действительности.
§ 5. Особенности выполнения операций с плавающей
точкой
При выполнения действий над числами, представленными в
форме с плавающей запятой, в каждом процессоре имеется предназначенное для этой цели АЛУ (арифметико-логическое устройство), в некоторых семействах процессоров их может быть несколько. Операции в этом случае производятся над дробными частями числа (мантиссами) и над их порядками. Операции над порядками производятся для определения порядка результата и для
подготовки мантисс, например, к сложению и вычитанию. При
сложении порядки и мантиссы, представляющие числа в форме с
плавающей запятой, в ЗУ обычно хранятся в прямом коде. При
выборке слагаемых из ЗУ их мантиссы и порядки разделяются и
поступают в соответствующие схемы АЛУ. В схеме, оперирующей порядками, они сравниваются (если будет производится операция сложения или вычитания двух чисел). Для упрощения срав16
нения все современные процессоры вместо порядков работают не
с порядками, а с характеристиками. Характеристики обычно кодируются следующим образом если для размещения кодов порядков p в разрядной сетке отводится q + 1 разряд, то отрицательные и положительные порядки представляются увеличенными на
2q , т.е. p = p + 2q. Тогда порядки в диапазоне −2q ≤ p ≤ 2q − 1 ,
оказываются записанными в виде 0 ≤ p ≤ 2q +1 −1. Например, если
q + 1 = 7 , то все порядки в диапазоне -1000000 ÷+0111111 (64÷+63) в смещенном виде будут кодироваться положительными
числами 0000000 до 1111111, т.е. процессор оперирует только с
положительными числами [1]: Перед выводом нужных результатов, характеристики обратно преобразуются в истинные порядки.
Таким образом, в форме с плавающей точкой, любое число
записывается в виде пары ± p и ± m . Если в записи числа модуль
мантиссы находится в пределах
1
≤ m < 1 (2 — основание системы
2
счисления), то число называется нормализованным, в противном
случае — ненормализованным. Например, двоичное число
0.110101⋅10100
— нормализованное, а
0.010101 10111
—
ненормализованное. Во втором случае m < 0.1 , и имеет место нарушение нормализации вправо. Если же в процессе вычислений
значение мантиссы m > 1 , то имеет место нарушение нормализации влево. Подобный случай может возникнуть при сложении
нормализованных чисел одинакового порядка, в результате чего
слева от запятой появляется 1. Нормализованное представление
чисел позволяет сохранять в разрядной сетке большее количество
значащих цифр и, следовательно, повышает точность вычислений,
а также упрощает действия над порядками и мантиссами. Однако
может возникнуть необходимость в выполнении действий и над
17
ненормализованными числами. Поэтому в системах команд современных ЭВМ предусматривается выполнение действий, как с
автоматической нормализацией результатов операций, так и без
нормализации. Нормализация заключается в сдвиге мантиссы
влево или вправо таким образом, чтобы она удовлетворяла приведенному выше неравенству. Одновременно со сдвигом соответственно уменьшается или увеличивается порядок (характеристика)
[1]. Ниже рассмотрим порядок выполнения операций сложения
(вычитания) чисел A и B , заданных в форме с плавающей точкой.
Пусть A = 10 mA , B = 10 mB . Тогда S = 10 mS = 10 mA + 10 mB .
pA
pS
pB
pA
pB
Поскольку мантиссы меньше единицы, то чтобы не получить мантиссы, большей единицы, характеристики следует выравнять в сторону большей характеристики. Если p A > p B , то для выравнивания следует характеристику pB увеличить на величину разности p A − p B .
p
p
Тогда B = 10 mB = 10 mB
p
B
B
p
10
p
10
p
A
−pB
A
− pB
p
= 10 B10
p
p
A
mB
− pB
10
p
A
− pB
p
= 10 A m B и
p
S = 10 S mS = 10 A mA +10 A m B = 10 A (mA + m B ), т.е. p S = p A и
mS = mA + m B . Если выполняются операции с автоматической
нормализацией, то по окончании сложения сумма S нормализуется.
Таким образом, сложение (вычитание) чисел с разными порядками
состоит из трех этапов:
1. Выравнивание порядков слагаемых;
2. Сложение (вычитание) мантисс;
3. Нормализация результата.
Операция сложения (вычитания) аналогична сложению чисел с фиксированной запятой. При сложении мантисс возможны
случаи нарушения нормализации как влево, так и вправо. Резуль18
тат нормализуется путем сдвига мантиссы в нужную сторону и
коррекции характеристики суммы. Рассмотрим следующий пример: пусть требуется вычесть из числа A = 0.1100 ⋅10100 число
B = 0.1101⋅10101 . Характеристики p A = 100 + 103 = 100 + 1000 = 1100 ,
p B = 101 + 103 = 101 + 1000 = 1101 . Запишем коды мантиссы и харакпр
теристики слагаемого A — mAпр = 00*.1100, p A = 00*1100 Для вычипр
доп
таемого B — mBдоп = 11*.0011, p B = 00*1101, p B = 11*0011. Вычислим
разность характеристик
0*
1*
1*
0
1
1
+
1
0
1
1
0
1
0
1
1
0
1
1.
Отсутствие переноса свидетельствует о том, результат отрицательный, т.е. характеристика B больше характеристики A на 1
(прямой код разности равен -0001). Так как p B больше p A на единицу, то производится сдвигаем вправо на один разряд мантиссу
mAпр = 00*.01100 . Складываем мантиссы.
+
0
1
1
0*
1*
1*
.0
.0
.1
1
0
0
1
1
0
0
1
1
0
0
0
Результат получен в виде дополнения. Перевод в прямой код
дает следующий результат: A − B = −0.0111⋅10101 . Налицо нарушение нормализации вправо. Окончательный результат будет равен
A − B = −0.111⋅10100 , а в десятичном коде
A − B = − ⎛⎜ + + ⎞⎟ ⋅ 24 = − ⋅18 = −14.
2 4 8
8
1
1
⎝
1
7
⎠
С другой стороны
⎛
⎞
⎛
⎞
A − B = ⎜ 1 + 1 ⎟16 − ⎜ 1 + 1 + 1 ⎟ ⋅ 32 = 12 − 26 = −14.
⎝2
4⎠
⎝2
4 16 ⎠
Если сложить мантиссы (нормализованные) этих чисел, то получим
19
+
0
0
0
0*
0*
1*
.0
.1
.0
1
1
0
1
0
1
0
1
1.
Налицо нарушение нормализации влево. Нормализуем полученный результат 1.0011⋅10101 . Сдвигаем мантиссу на один разряд
вправо и к значению порядка (характеристики) суммы добавим
единицу. Нормализованный результат 0.10011⋅10110.
При вычислении произведения двух чисел из выражения для
p
p
произведения двух чисел A = mA 2 A и B = mB 2 B , представленного
p
в виде P = mP 2 pP = mA 2 A mB 2
pB
= mAmB 2
p A + pB
, следует, что порядок
произведения p P = p A + p B и мантисса произведения mP = m A mB .
Перемножение мантисс чисел, представленных в форме с
плавающей запятой, выполняется аналогично умножению чисел,
представленных в форме с фиксированной запятой. Порядок произведения определяется путем суммирования порядков сомножителей. Если вместо истинных порядков применяются характеристики p A = p A + 2q и p B = pB + 2q , где q — количество разрядов
числа, выражающее максимально возможный порядок, то характеристика произведения определяется как p p = p A + p B − 2q . Процесс умножения состоит из следующих этапов:
1. Определение знака произведения путем сложения по mod 2
знаковых разрядов мантисс сомножителей;
2. Определение характеристики произведения;
3. Перемножение мантисс;
4. Нормализация результата.
Если перемножаются двоичные нормализованные числа, то
мантисса произведения mP может иметь любое значение в пределах 0.01 ≤ mP < 1.0 , т.е. возможно только нарушение нормализации вправо не более чем на один разряд. Случаи переполнения
20
сумматора порядков фиксируются выработкой специального сигнала переполнения.
При делении чисел мантисса частного определяется путем
делении мантиссы делимого на мантиссу делителя, а характеристика частного — вычитанием характеристики делителя из характеристики делимого. Деление мантисс выполняется точно так же,
как и деление чисел с фиксированной запятой, выраженных в виде
правильных дробей. Процесс деления состоит из следующих этапов:
1. Определение знака частного;
2. Определение характеристики частного;
3. Деление мантисс;
4. Нормализация результата.
При делении двоичных нормализованных чисел мантисса
частного оказывается заключенной в пределах 0.1 < mD < 10 . В результате может иметь место нарушение нормализации влево не
более, чем на один разряд.
§ 6. Двоично-десятичная арифметика
Для обработки экономической информации, решения
различных экономических задач, как правило относящихся к области целочисленного, программирования
предусматривается
возможность выполнения операций непосредственно в десятичной
системе счисления над числами, представленными в двоично-десятичной форме. При выполнении арифметических операций над
двоично-десятичными числами они преобразуются в какой-либо
другой код, обеспечивающий возможность применения достаточно несложных устройств для выполнения операций. Если при
сложении десятичных цифр получается результат больший десяти,
то необходимо единицу переноса передать в следующий десятич21
ный разряд. Наиболее просто это можно сделать, представив либо
цифры обоих слагаемых в так называемом коде с избытком три,
либо цифры одного из слагаемых в коде с избытком шесть [1]. Дополнение второго числа (при вычитании) определяем путем инвертирования значений двоичных разрядов в тетрадах с прибавлением единицы в младший разряд младшей тетрады. Такое дополнение получается с потетрадным избытком 6. Поэтому если
при сложении нет переносов из каких-либо тетрад, то они
корректируются путем вычитания из них 6 (прибавления 1010 —
дополнения 6 до 16). Кроме того, наличие переноса из старшей
тетрады при сложении числа A и дополнения числа B свидетельствует о том, что результат получился в прямом коде, т.е.
положительный. Если нет переноса, то получается отрицательный
результат в виде дополнения. Таким образом, при сложении чисел
с разными знаками, знак результата определяется по наличию или
отсутствию переноса из старшей тетрады. Когда при сложении чисел с одинаковыми знаками возникает перенос из старшей тетрады, то это говорит о десятичном переполнении. Ниже рассмотрим
примеры выполнения операций сложения и вычитания.
1.
числа
Вычислить сумму183 и 284. В двоично-десятичном коде оба
будут
иметь
следующий
вид:183→000110000011,
а
284→001010000100. Найдем представление первого числа в коде с
избытком 6:
+
0
0
0
0
1
1
0
1
1
1
0
1
1
0
1
0
1
1
0
1
1
0
0
0
0
0
1
0
1
0
1
1
0
1
0
1,
далее вычислим сумму
+
0
0
1
1
0
0
1
1
1
1
0
0
1←
1
1
0
1
0
1
22
1
0
1
0
0
0
1
0
1
0
1
1
0
0
0
1
0
1.
Имеет место перенос из второй в третью тетраду, следовательно необходимо провести коррекцию первой и третьей тетрад:
+
1←
1
1
0
0
0
1
1
1
0
0
0
0
0
0
0
1
0
1
1
0
1
0
0
0
1
1
0
1←
1
0
1
0
1
1
1
0
1.
Окончательный результат — 467.
Далее рассмотрим вычисление суммы 284 и 98. Двоичнодесятичный код 98 равен 000010011000. Найдем представление
284 с избытком 6:
0
0
1
+
0
1
0
1
1
0
0
0
0
1
0
1
0
1
1
0
1
1
0
0
0
0
0
1
1
1
0
0
1
1
0
0
0,
Вычисление суммы даст следующий результат:
+
1
0
1
0
0
0
0
0
0
0
0
1
1←
1
1
1
1
0
0
1
0
0
0
1
0
1←
1
1
0
0
0
0
1
0
1
0
0
0,
корректируем третью тетраду
+
1←
1
1
0
0
0
0
0
1
1
1
0
1
1
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
1
0
0
0.
Окончательный ответ 382.
2.
Теперь вычислим разность 284 и 183.
( )
Дополнение 183 до 1000 103 равно 817. Двоично-десятичный код 817 равен 100000010111. Сложим этот код с представлением с избытком 6 числа 284.
+
1←
1
1
0
0
0
0
0
0
0
0
0
1
1←
1
0
0
1
0
0
1
0
0
0
1
0
1←
1
0
0
0
1
0
1
1
0
0
1
1.
Имеют место переносы из всех трех тетрад, следовательно никакой корректировки не требуется. Кроме того, перенос из третьей
23
(старшей тетрады) означает, что результат вычитания положительный. Нетрудно заметить, что он равен 101.
3.
Ниже рассмотрим процесс вычисления разности 183 и 284.
Дополнение 284 до 1000 равно 716, а в двоично-десятичном
представлении 011100010110. Код уменьшаемого с избытком 6
равен 011111101001, тогда
+
0
0
1
1
1
1
1
1
1
1
1
0
1
0
1
1
0
1
1
0
1
0
1
1
1
0
1
0
1
1
0
1
1
1
0
1.
Отсутствует перенос из старшей тетрады, следовательно результат отрицательный, а в силу отсутствия переносов из остальных тетрад, ясно, что их также нужно корректировать, и
+
1←
1
1
1
1
0
0
1
1
0
0
0
0
1←
1
1
1
1
0
0
1
1
0
1
0
1
1←
1
1
1
1
0
0
1
1
0
1
0
1.
Итоговый результат равен 899, т.е. дополнению 101 до 1000, или
же в прямом коде — 101.
4.
И, в заключение, рассмотрим разности 284 и 98, а также 98 и
284. Дополнение 98 до 1000 равно 902, т.е. в двоично-десятичном
представлении 100100000010, а тогда
+
1←
1
1
0
0
0
0
0
0
0
0
1
1
1
0
1
1
0
1
1
0
1
0
0
0
1
0
1
0
0
1
1
1
0
0
0
0.
Результат положительный (есть перенос из старшей тетрады), но
требуется коррекция первой и второй тетрад:
+
0
0
0
0
0
0
0
0
0
1
0
1
1←
1
1
1
1
0
0
1
1
0
0
0
0
1←
1
1
0
1
0
1
0
1
1
0
0
0.
Разность равна 186. Далее рассмотрим вычисление разности 98 и
24
284. Найдем двоично-десятичный код 98 с избытком 6 и дополнения 284 до 1000 возьмем из предыдущих примеров. Тогда
+
0
0
0
0
1
1
0
1
1
0
0
0
1
0
1
0
1
1
0
1
1
1
0
1
1
0
1
0
1
1
0
1
1
0
0
0
+
0
0
1
1
1
1
1
1
1
0
1
0
1
0
0
1
0
0
1
0
0
1
1
1
1
0
0
1
1
1
1
1
0
0
0
0.
и
1←
1←
Переноса из старшей тетрады нет (результат отрицательный), корректируем старшую тетраду
+
1←
1
1
1
1
0
0
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
1
0
0
0
1
0
1
0
0
0
0
0
0.
Ответ равен 814, т.е. дополнению 186 до 1000, или в прямом коде 186.
§ 7. Задания для самостоятельного выполнения
1.
Перевести в двоичную систем счисления следующие
десятичные числа: 41.336, 49.25, 33.178, 193, 625,441.
2.
Перевести в десятичную систем счисления числа, заданные
в двоичном коде: 11010, 1000111.10011,0.110111, 11001100101.
3.
Используя двоично-десятичный код перевести в двоичную
систему десятичные числа: 343, 183, 17, 29, 47,121,48, 15, 33,99.
4.
Используя обратный код вычислить разность чисел:
1) 0.101101, −0.100111;2 ) 0.011101, −0.110111; 3) 0.1101, −0.1000111.
5.
Используя дополнительный код вычислить разность чисел:
1) 0.101001, −0.101111;2 ) 0.010101, −0.110111; 3) 0.101, −0.1000111.
6.
Вычислить произведение чисел:
25
1) A = +0.11011, B = +0.01101;2 ) A = +0.11001, B = −0.01011;
3) A = −0.1101, B = −0.1110101;4 ) A = −0.11001, B = 0.0011011.
7.
Методом деления без восстановления остатка найти частное
от деления A на B :
1) A = +0.1100011, B = +0.0111101;2 ) A = +0.1101111, B = −0.1010101;
3) A = −0.1101, B = −0.1110101;4 ) A = −0.11001, B = 0.0011011.
8.
Найти сумму (разность) двоичных чисел, представленных в
форме с плавающей точкой:
1) A = +0.11011⋅10110 , B = +0.01101⋅1011;
2 ) A = +0.11001⋅10100 , B = +0.01011⋅10111;
3) A = +0.11011⋅10110 , B = −0.01101⋅1011;
4 ) A = +0.11001⋅10100 , B = −0.01011⋅10111.
9.
Найти произведение двоичных операндов, представленных
в форме с плавающей точкой:
1) A = +0.11011⋅10110 , B = +0.01101⋅1011;
2 ) A = +0.11001⋅10100 , B = +0.01011⋅10111;
3) A = +0.11011⋅10110 , B = −0.01101⋅1011;
4 ) A = +0.11001⋅10100 , B = −0.01011⋅10111.
10. Найти частное от деления двоичных операндов,
представленных в форме с плавающей точкой:
1) A = +0.01001⋅1011 , B = +0.11011⋅10110 ;
2 ) A = +0.10001⋅10100 , B = −0.11011⋅10111;
3) A = −0.11011⋅1011 , B = −0.1111⋅10101;
4 ) A = −0.10001⋅10100 , B = −0.11011⋅10111.
26
ЛИТЕРАТУРА
1. Дроздов Е. А., Комарницкий В. А., Пятибратов А. П.
Многопрограммные цифровые вычислительные машины., М.,
Воениздат, 1974.
2. Жирков В.Ф., Маслов И.Д. Построение преобразователей
двоично-десятичного кода целых чисел в двоичный код и двоичного кода правильных дробей в двоично-десятичный код. Инженерный журнал: наука и инновации, 2013, вып. 11. URL:
http://engjournal.ru/catalog/it/hidden/1008.html.
3. Карцев М. А. Арифметика цифровых машин., М., Наука,
1969.
4. Таненбаум Э. Архитектура компьютера, С-Пб., Питер, 2007.
5. Сергеев С. Л. Компьютерная арифметика, С-Пб., изд. СПбГУ, 1995.
27
ОГЛАВЛЕНИЕ
§ 1. Системы счисления, используемые в современных вычислительных системах, представление и перевод чисел из одной системы счисления в другую .....................................................................
3
§ 2. Кодирование чисел в компьютере..........................................
7
§ 3. Выполнение процессором операций сложения и вычитания 10
§ 4. Реализация операций умножения и деления ........................
13
§ 5. Особенности выполнения операций с плавающей точкой
16
§ 6. Двоично-десятичная арифметика...........................................
21
§ 7. Задания для самостоятельного выполнения ...............................25
Литература ......................................................................................... 27
28
Download