Сложение отрицательных чисел
Раздел 3. Технические средства информационных технологий
Лекция № 8. Двоичная арифметика
Выполнение арифметических операций над числами с фиксированной запятой.
Выполнение арифметических операций над числами с плавающей запятой.
Литература: 1. Основы вычислительной техники и программирование:
Учебник / Под ред. Ю.А.Бузунова.- М.: Воениздат, 1981.
2.Вычислительные машины, системы и сети: Учебник /
А.П.Пятибратов, С.Н.Беляев и др.; Под ред. проф. А.П.Пя-
тибратова. – М.: Финансы и статистика, 1991.
Выполнение арифметических операций над
Числами с фиксированной запятой
Все арифметические операции в ЭВМ выполняются над числами, представленными в двоичной системе счисления по правилам этой системы счисления. В частности, результаты выполнения арифметического сложения и умножения представлены в таблице:
0 + 0 = 0 | 0 х 0 = 0 |
0 + 1 = 1 | 0 х 1 = 0 |
1 + 0 = 1 | 1 х 0 = 0 |
1 + 1 = 10 | 1 х 1 = 1 |
Как было отмечено ранее, для упрощения технической реализации арифметическо-логического устройства (АЛУ) ЭВМ в ней предусмотрено выполнение только одной арифметической операции – сложение положительных чисел. Выполнение таких арифметических операций, как сложение отрицательных чисел, умножение и деление осуществляется по различным алгоритмам, приводящим эти операции к операции сложения положительных чисел.
Рассмотрим основные алгоритмы выполнения арифметических операций над числами, представленными в форме с фиксированной запятой.
Сложение положительных чисел
Операция сложения положительных чисел выполняется над числами, представленными в прямом коде по обычным правилам двоичной арифметики. Результат сложения также будет представлен в прямом коде.
Например: Сложить числа А = 27 и В = 9.
А(2) = 11011, [А]ПК = 0.11011,
В(2) = 1001, [В]ПК = 0.1001,
Как видно, двоичные коды чисел содержат разное количество разрядов, поэтому перед выполнением операции «сложение» необходимо выровнять их количество (добавлением нулей перед цифрой 1 в старшем разряде целой части числа и, если необходимо, после цифры 1 в младшем разряде дробной части числа).
[А + В]ПК = 0.11011
+
0.01001
1.00100
Как видно из примера, результат сложения двух положительных чисел оказался отрицательным, чего быть не может. Это свидетельствует о том, что имело место переполнение разрядной сетки. Чтобы избежать такого явления, увеличим на один разряд целую часть разрядной сетки и повторим операцию сложения:
[А + В]ПК = 0.011011 = 0.100100.
+
0.001001
0.100100
Таким образом, А + В = 100100(2) = 36(10). Результат сложения правильный.
Сложение отрицательных чисел
Использование в ЭВМ прямого кода требует наличия специальных устройств для выполнения операции вычитания (сложения отрицательных чисел). Вместе с тем, как отмечалось ранее, операцию вычитания можно заменить операцией сложения, если использовать специальные коды отрицательных чисел. Основная идея замены вычитания чисел их сложением заключается в том, что область отрицательных чисел переносится в область положительных чисел и в операции сложения участвуют не сами числа, а ихизображения (рисунок 1).
Рисунок 1 – Область чисел и их изображений
С учетом сказанного, сложение отрицательных чисел в ЭВМ выполняется вобратныхилидополнительных кодах.Сформулируем правило сложения чисел, представленных в форме с фиксированной запятой в обратном коде.
Правило 1. Для того чтобы при сложении обратных кодов двух чисел получить обратный код суммы, необходимо сложить обратные коды слагаемых по правилам сложения двоичных чисел, рассматривая при этом знаковые разряды как обычные цифровые.
Если появляется единица переноса из знакового разряда, то ее следует циклически перенести в младший разряд и просуммировать с ранее полученным результатом.
Последнее обстоятельство (добавление единицы в младший разряд) увеличивает время выполнения операций сложения. Поэтому в ЭВМ чаще находят применение дополнительные коды. Сформулируем правило сложения чисел, представленных в форме с фиксированной запятой в дополнительном коде.
Правило 2.Для того чтобы при сложении дополнительных кодов двух чисел получить дополнительный код суммы, необходимо сложить дополнительные коды слагаемых по правилам сложения двоичных чисел, рассматривая знаковые разряды как обычные цифровые. При возникновении единицы переноса из знакового разряда ее следует опустить (не учитывать).
Для получения окончательного результата сложения, независимо от того, какие коды чисел использовались (обратные или дополнительные), необходимо записать полученный результат в прямом коде.
Рассмотрим записанные алгоритмы на примере.
Пример: Сложить два числа А = 11 и В = -13,25 в обратномкоде.
А(2) = 1011; [А]ПК = 0.1011,00; [А]ОК = 0.1011,00
В(2) = -1101,01; [В]ПК = 1.1101,01; [В]ОК = 1.0010,10
[А + В]ОК = 0.1011,00 = 1.1101,10.
+
1.0010,10
1.1101,10
[А + В]ПК = 1.0010,01.
Таким образом, А + В = -10,01(2) = -2,25(10). Результат сложения правильный.
Пример: Сложить два числа А = 11 и В = -13,25 в дополнительном коде.
А(2) = 1011; [А]ПК = 0.1011,00; [А]ДК = 0.1011,00
В(2) = -1101,01; [В]ПК = 1.1101,01; [В]ДК = 1.0010,11
[А + В]ДК = 0.1011,00 = 1.1101,11.
+
1.0010,11
1.1101,11
[А + В]ПК = 1.0010,01.
Таким образом, А + В = -10,01(2) = -2,25(10). Результат сложения правильный.
Умножение двух чисел
Умножение двоичных многоразрядных чисел, представленных в естественной форме, производится путем образования частичных произведений и последующего их суммирования. Каждое частичное произведение равно нулю, если в соответствующем разряде множителя стоит 0, или равно множимому, сдвинутому на соответствующее число разрядов влево, если в разряде множителя стоит 1. При этом используются прямые коды чисел.
Таким образом,операция умножения многоразрядных двоичных чисел внутри ЭВМсводится к операции сдвига и сложения. Положение запятой, отделяющей целую часть от дробной части, определяется так же, как и при умножении десятичных чисел.
Алгоритм выполнения операции умножения:
1. Определить знак произведения. Для этих целей применить операцию сложения по модулю «2» к знаковым разрядам сомножителей.
Результат операции сложения по модулю «2» определяется следующим образом:
0 Å 0 = 0;
0 Å 1 = 1;
1 Å 0 = 1;
1 Å 1 = 0.
2. Перемножить модули чисел без учета знакового разряда следующим образом:
а) если в первом (младшем) разряде множителя расположена 1, то записать в сумматор модуль множимого, а если 0 – то во все разряды сумматора записать нули;
б) если во втором разряде множителя расположена 1, то прибавить к содержимому сумматора множимое, сдвинутое на один разряд влево, а если 0 – то прибавить нули во всех разрядах к содержимому сумматора;
в) выполнять пункт б) n – 1 раз, где n – число значащих разрядов в множителе.
3. Получить окончательный результат путем прибавления знака произведения, полученного на первом этапе в знаковый разряд результата.
Пример: Перемножить числа А = 18 и В = -5,5.
А(2) = 10010; [А]ПК = 0.10010;
В(2) = - 101,1; [В]ПК = 1.101,1.
Определим знак произведения:
0 Å 1 = 1.
Перемножим модули чисел:
101,1
+
10010
+
00000
+
10010
1100011,0
Запишем окончательный результат:
[А х В]ПК = 1.1100011, А х В = - 99(10).
Деление чисел
Известны несколько алгоритмов деления чисел, применяемых в ЭВМ, например, деление без восстановления остатка, деление с восстановлением остатка и др. Остановимся на одном из них – алгоритме деления без восстановления остатка. Этот алгоритм может быть применен при условии, если модуль делимого меньше модуля делителя (то есть, результат деления должен представлять собой правильную дробь). Если же данное условие не выполняется, то используют масштабирующие множители.
Рассмотрим алгоритм. Предположим, что необходимо разделить число А на число В. Тогда:
1. Проверить выполнение условия ½А½ < ½В½. Если условие выполняется, то перейти на следующий пункт, если нет – то ввести масштабирующий коэффициент, а затем перейти на следующий пункт.
2. Получить прямые коды делимого и делителя, а также дополнительный код делителя. При этом независимо от того, положительным или отрицательным числом является делитель, его прямой код должен быть записан как для положительного числа (в знаковом разряде нужно записать «0»), а дополнительный – как для отрицательного (в знаковом разряде нужно записать «1»).
3. Определить знак частного, применив операцию сложения по модулю «2» к цифрам в знаковых разрядах прямых кодов делимого и делителя.
4. Удвоить делимое (удвоение двоичного числа эквивалентно сдвигу его влево на один разряд). Вычесть из удвоенного делимого делитель (то есть прибавить его в дополнительном коде).
5. Определить знак первого промежуточного результата (D1). Если он положительный (D1 > 0), то записать в первый разряд результата после запятой «1», а если отрицательный (D1 < 0) – то записать «0».
Удвоить первый промежуточный результат. Если он был положительным, то вычесть из удвоенного первого промежуточного результата делитель, а если он был отрицательным, то прибавить к удвоенному первому промежуточному результату делитель.
6. Определить знак второго промежуточного результата (D2). Если он положительный (D2 > 0), то записать во второй разряд результата после запятой «1», а если отрицательный (D2 < 0) – то записать «0».
Удвоить второй промежуточный результат. Если он был положительным, то вычесть из удвоенного второго промежуточного результата делитель, а если он был отрицательным, то прибавить к удвоенному второму промежуточному результату делитель.
И так далее …
Алгоритм выполняется до тех пор, пока очередной промежуточный результат не станет равным нулю, либо пока не будет достигнута требуемая точность результата.
7. Записать результат деления в двоичной форме с учетом знака (результат будет представлен в прямом коде). Перевести результат из двоичной системы счисления в десятеричную, учесть масштабирующий множитель.
Пример: Разделить число А = -7 на число В = 1,2.
Решение.
Поскольку ½А½ > ½В½, умножим делитель на 10. Тогда В = 12.
А(2) = - 111; [А]ПК = 1.111;
В(2) = 1100; [В]ПК = 0.1100; [В]ДК = 1.0100.
Определим знак частного
1 Å 0 = 1.
Выполним деление.
Выровняем число разрядов делимого и делителя, для чего добавим в старший разряд делимого один нуль [А]ПК = 1.0111.
1.0111
х 2
0.1110
+
1.0100
0.0010 D1 > 0 (1)
0.0100 2D1
+
1.0100
1.1000 D2 < 0 (0)
1.0000 2D2
+
0.1100
1.1100 D3 < 0 (0)
1.1000 2D3
+
0.1100
0.0100 D3 > 0 (1)
и т.д. до получения требуемой точности результата.
Результат деления:[А : 10В]ПК = 1.1001; (А : 10В) = - 0,1001(2) = - 0,5625(10).
Окончательно имеем: А : В » - 5,625.