Автор: Пользователь скрыл имя, 08 Января 2012 в 18:52, лабораторная работа
Ознакомление с алгоритмами выполнения операции сложения и вычитания чисел, представленных в формате с фиксированной запятой, чисел, представленных в D-кодах, приобретение практических навыков выполнения операций над этими числами.
Лабораторная
работа№2
Тема: Выполнение операций сложения и вычитания над числами с фиксированной запятой
и
над двоично-десятичными
числами.
Цель
работы: ознакомление с алгоритмами
выполнения операции сложения и вычитания
чисел, представленных в формате с фиксированной
запятой, чисел, представленных в D-кодах,
приобретение практических навыков выполнения
операций над этими числами.
Теоретические
сведения
Операции
сложения и вычитания
чисел в машинных
кодах
Поскольку
организовать аппаратную реализацию сложения
двух чисел организовать значительно
проще, чем вычитание, то в ВМ более широкое
распространение получило приведение
арифметических операций к двум основным
операциям: сложению и сдвигу. Операция
вычитания одного числа из другого сводится
к сложению числа с отрицательным знаком.
Как уже ранее отмечалось, в машине используются
прямой, обратный и дополнительный коды.
Правила сложения чисел в прямом коде не отличаются от обычных правил сложения, т.е. если оба слагаемых имеют одинаковые знаки, то их числовые разряды складываются, а сумме приписывается знак одного из них.
Если слагаемые имеют разные знаки, то из числовых разрядов большего по абсолютной величине числа вычитается меньшее, а сумме приписывается знак большего слагаемого. При этом числовые разряды кода обрабатываются отдельно от знаковых, так как последние не имеют веса.
Рассмотрим четыре случая получения суммы при │Х1│> │Х2│ и
│Х1│
+│Х2│ < 1
Пусть заданы два числа: Х1 = 0,10110; Х2 = 0,00101;
1) Х1 > 0 ; Х2 > 0 ; Х3 = Х1 + Х2 > 0
│Х1│ = +0,10110
│ Х2│ = 0,00101
│Х3│ = 0,11011
Результат [Х3]пр = 0,11011
2)
Х1 > 0 ; Х2 < 0 ; Х3
= Х1 + Х2 > 0
│ Х1│ = __0,10110
│ Х2│ = _ 0,00101
│Х3 │ = 0,10001
Результат [Х3]пр = 0,10001
3) Х1 < 0 ; Х2 > 0 ; Х3 = Х1 + Х2 < 0
│ Х1│
= __0,10110
│ Х2│ = _ 0,00101
│Х3 │ = 0,10001
Результат [Х3]пр = 1,10001
4) Х1 < 0 ; Х2 < 0 ; Х3 = Х1 + Х2 < 0
│Х1│ = +0,10110
│ Х2│ = 0,00101
│Х3│ = 0,11011
Результат [Х3]пр = 1,11011
Таким
образом, в прямом коде знаковый разряд
и цифровую часть числа нельзя рассматривать
как единое целое, а выполнение операции
сложения затруднено тем, что необходимо
кроме сумматора иметь и вычитатель кодов
чисел. Поэтому прямой код не применяется
для выполнения операции алгебраического
сложения, но он удобен при выполнении
операции умножения и деления.
В дополнительном коде операция вычитания заменяется операцией алгебраического сложения. При этом знаковый разряд и цифровая часть числа рассматриваются как единое целое, в результате чего с отрицательными числами машина оперирует как с неправильными дробями. Правильный знак получается автоматически в процессе суммирования содержимого знаковых разрядов операндов и единицы переноса из цифровой части, если она есть.
Считаем, что │Х1│> │Х2│ и [Х1]д + [Х2]д < 1
Пусть заданы два числа: Х1 = 0,10110; Х2 = 0,00101. Рассмотрим четыре случая:
1) Х1 > 0 ; Х2 > 0 ; Х3 = Х1 + Х2 > 0
Ввиду того, что изображение
[Х3]д = [Х1]д + [Х2]д = Х1 + Х2
Правильный
знак суммы получается автоматически,
так как знаковые цифры равны
0, а [Х1]д + [Х2]д
< 1 по условию, т.е. нет 1 переноса в знаковый
разряд.
Х1 = +0,10110
Х2 = 0,00101
Х3 = 0,11011
Результат: [Х3]д
= [Х3]пр = 0,11011
2) Х1 > 0 ; Х2 < 0 ; Х3 = Х1 + Х2 > 0
Сумма
положительна, значит результат должен
быть получен в прямом коде. Правильный
знак суммы получается в связи с тем, что
есть перенос в знаковый разряд суммы,
что дает результирующий знак 0. В этом
случае возникает перенос из знакового
разряда суммы, который не должен учитываться,
т.е. найденная сумма требует коррекции
(-2), которая производится автоматически
(не учитывается перенос из знакового
разряда суммы):
[Х1]д = +0,10110
[Х2]д = 1,11011
[Х3]д = 10,10001 Результат: [Х3]д = [Х3]пр = 0,10001
3) Х1 < 0 ; Х2 > 0 ; Х3 = Х1 + Х2 < 0
Так
как сумма отрицательна, то она
сразу получается в дополнительном
коде. Правильный знак получается автоматически,
так как один знаковый разряд равен
1 и нет переноса 1 в знаковый разряд.
[Х1]д = +1,01010
[Х2]д = 0,00101
[Х3]д = 1,01111
Результат: [Х3]д
= 1,01111; [Х3]пр = 1,10001
4) Х1 < 0 ; Х2 < 0 ; Х3 = Х1 + Х2 < 0.
Так
как сумма отрицательна, то результат
получается в дополнительном коде.
Поскольку оба знаковых разряда равны
1 и есть перенос из цифровых разрядов
в знаковые, получается правильный знак.
В этом случае возникает перенос из знакового
разряда суммы, который не должен учитываться.
Как и во втором случае, сумма требует
коррекции (-2), которая производится автоматически
(не учитывается перенос из знакового
разряда).
[Х1]д = +1,01010
[Х2]д = 1,11011
[Х3]д = 11,00101
Результат: [Х3]д
= 1,00101; [Х3]пр = 1,11011
Таким образом, во всех случаях знак суммы формируется автоматически в результате общих правил поразрядного кодирования знаковых и цифровых разрядов операндов, при этом правила и результат суммирования не изменяются, если слагаемые поменять местами.
В обратном коде, как и в дополнительном операция вычитания заменяется операцией сложения. При этом знаковый разряд и цифровая часть рассматриваются так же как единое целое, вследствие чего машина оперирует с отрицательными числами как с неправильными дробями. Правильный знак суммы получается автоматически в процессе суммирования цифр знаковых разрядов операндов и единицы переноса из цифровой части, если она есть. Характерной особенностью обратного кода является наличие циклического переноса (если он возникает) из знакового разряда в младший разряд цифровой части, благодаря которому осуществляется коррекция суммы на 2-n .
Считаем, что │Х1│> │Х2│ и [Х1]об + [Х2]об < 1
Пусть заданы два числа: Х1 = 0,10110; Х2 = 0,00101. Рассмотрим четыре случая:
1) Х1 > 0 ; Х2 > 0 ; Х3 = Х1 + Х2 > 0
Так как обратный код положительных чисел не отличается от самих чисел, то определение их суммы совпадает с ее получением в прямом коде:
[Х3]об = [Х1]об + [Х2]об = Х1 + Х2
Правильный
знак суммы получается автоматически,
так как знаковые цифры равны
0, а [Х1]об + [Х2]об
< 1 по условию, т.е. нет 1 переноса в знаковый
разряд.
Х1 = +0,10110
Х2 = 0,00101
Х3 = 0,11011 Результат: [Х3]об = [Х3]пр = 0,11011
2) Х1 > 0 ; Х2 < 0 ; Х3 = Х1 + Х2 > 0
Сумма
положительна, следовательно результат
должен быть получен в прямом коде.
Полученная сумма отличается от истинной
на (2-2-n), то есть нужна коррекция
на эту величину. Коррекция на 2 получается
автоматически (в разрядной сетке нет
места для 1 переполнения знакового разряда),
коррекция на 1 младшего разряда получается
путем прибавления в младший разряд суммы
единицы переполнения, которая возникает
при сложении цифр знаковых разрядов,
т.е. выполняется так называемый циклический
перенос.
[Х1]об = +0,10110
[Х2]об = 1,11010
10,10001
+ 1
[Х3]об = 0,10001
Результат: [Х3]об
= [Х3]пр = 0,10001
3) Х1 < 0 ; Х2 > 0 ; Х3 = Х1 + Х2 < 0
Сумма отрицательна, значит, результат должен получиться в обратном коде, т.е. результат коррекции не требует.
[Х1]об = +1,01001
[Х2]об = 0,00101
[Х3]об = 1,01110
Результат: [Х3]об
= 1,01110; [Х3]пр = 1,10001
4) Х1 < 0 ; Х2 < 0 ; Х3 = Х1 + Х2 < 0.
Сумма
отрицательна, следовательно, результат
должен быть получен в обратном коде. Как
и во втором случае необходима коррекция
результата только на единицу младшего
разряда, так как для изображения 2 в разрядной
сетке нет места. Поправка вносится аналогично
второму случаю путем циклического переноса.
[Х1]об = +1,01001
[Х2]об = 1,11010
11,00011
+1
[Х3]об
= 1,00100 Результат:
[Х3]об
= 1,00100; [Х3]пр = 1,11011
Во всех рассмотренных случаях сложения кодов слагаемые можно поменять местами и при этом код суммы не изменится. Обратный код достаточно удобен для выполнения операции алгебраического сложения, однако выполнять операции умножения и деления в обратном коде смысла нет.