Сложение и вычитание двоичных чисел с фиксированной точкой
При сложении положительного и отрицательного чисел, для которых модуль отрицательного меньше модуля положительного (случай 3, рис. 3.7, с), результат получается прямом коде. При сложении старших разрядов модулей чисел единица переносится в знаковый разряд. В итоге, от значения 10 в знаковый разряд записывается 0, а единица прибавляется к модулю результата. В итоге, 60 м 4- (—40м) дает… Читать ещё >
Сложение и вычитание двоичных чисел с фиксированной точкой (реферат, курсовая, диплом, контрольная)
Принцип сложения целых положительных m-разрядных двоичных чисел
состоит в суммировании отдельных разрядов по правилу:
где с* — перенос в г-й разряд из (г — 1)-го; а, 6, — г-е разряды слагаемых А, В; Si — сумма г-го разряда; q+i — перенос в (г 4- 1)-й разряд, г = 0,1,…, т — 1.
Разряды суммы формируются последовательно, начиная с младшего разряда. Для нулевого разряда (i = 0) перенос с0 отсутствует, поэтому выражение (3.1) примет ВИД О0 + Ь" = S0(Cl).
Рассмотрим выполнение операции сложения более подробно для чисел в обратном и дополнительном кодах.
Прежде всего, рассмотрим случай, когда происходит переполнение разрядной сетки. В этом случае результатное число не помещается в отведенные разряды. Подобная ситуация возникает в одном из двух случаев:
- — числа А и В положительные, А — В ^ 2т
- — числа А и В отрицательные, |Л| + В ^ 2т.
В результате переполнения получают неверный результат операции сложения, перенос ст в знаковый разряд игнорируется. При исполнении программ в этой ситуации обычно возникает ошибка: выход за допустимые границы значений. В большинстве СВТ вводится специальный бит переполнения, в котором отслеживается появление подобной ситуации.
Сложение нулевых чисел (хотя бы одно число нулевое) интереса не вызывает. При сложении чисел А и В в обратных кодах рассмотрим следующие случаи (условие переполнения разрядной сетки не выполняется):
- 1. А > 0 и В > 0. Сложение выполняется для всех разрядов, включая знаковый, по стандартным правилам для двоичных чисел.
- 2. А > 0 и В < 0, В > А. Аналогично предыдущему случаю, но результат получается в обратном коде.
- 3. А > 0 и В < 0, |В| < А. При сложении старших разрядов получается число 10, которое должно быть записано в знаковый разряд. Поступают следующим образом: в знаковый разряд заносится 0, а единица прибавляется к результату сложения модулей А и В. Результат получается в прямом коде.
- 4. A < 0 и В < 0. При сложении старших разрядов получается число 11, которое должно быть записано в знаковый разряд. Поступают следующим образом: в знаковый разряд заносится 1, вторая единица прибавляется к результату сложения модулей Л и В. Результат получается в обратном коде.
Пример 3.6. Выполнить сложение чисел в обратных кодах в 8-разрядной сетке: а) 60ю 4- 80io; б) — 60ю 4- (—80ю); в) 60ю 4- 40ю; г) 40до 4- (—60ю); д) 60ю 4- (—40ю); е) — 60ю 4- (—40ю);
Решение. Представим числа в обратном коде (знаковый разряд выделен полужирным начертанием): -60Ю: 1100 ООП, -80ш: 1010 1111, 60Ш: ООП 1100, 801О: 0101 0000, 40ю: 0010 1000, -40ш: 1101 0111.
При попытке выполнить сложения а) и б) происходит переполнение разрядной сетки: максимально возможное значение, но модулю не должно превышать 2 7 = 128. Другой способ определить ситуацию переполнения (без вычисления десятичных значений) — получение в знаковом разряде не ожидаемого значения. Так, при сложении б0ю+80ю в знаковом разряде получается 1, а при сложении — 60ю+(—80ю) ~ значение 0.
На рис. 3.7 приведено выполнение сложений в)-е).
Рис. 3.7. Сложение чисел в обратном коде.
При сложении положительных чисел (случай 1, рис. 3.7, а) результат получается в прямом коде (напомним, что для положительных чисел прямой и обратный код совпадают). Имеем: 60ю 4- 40ю представляется как ОНО 0100 = 100 м;
При сложении положительного и отрицательного чисел, для которых модуль отрицательного больше модуля положительного (случай 2, рис. 3.7, б), результат получается в обратном коде, поэтому для получения десятичного числа результат следует проинвертировать (кроме знакового разряда). Проинвертировав представление 1110 1011, получим 1001 0100 = —20ю.
При сложении положительного и отрицательного чисел, для которых модуль отрицательного меньше модуля положительного (случай 3, рис. 3.7, с), результат получается прямом коде. При сложении старших разрядов модулей чисел единица переносится в знаковый разряд. В итоге, от значения 10 в знаковый разряд записывается 0, а единица прибавляется к модулю результата. В итоге, 60 м 4- (—40м) дает представление 0001 0100 = 20 м;
Наконец, при сложении двух отрицательных чисел (случай 4, рис. 3.7, г) от значения И, которое должно быть записано в знаковый разряд, одна единица прибавляется к модулю результата, а вторая идет в знаковый разряд. Результат получается в обратном коде, поэтому, выполнив обратное инвертирование, получим значение 1110 0100 = -100м- ?
Рассмотрим выполнение сложения в дополнительном коде. Здесь также возможны четыре случая (считаем, что переполнения разрядной сетки не произошло):
- 1. А > 0 и В > 0. Выполнение аналогично сложению в обратном коде, так как прямой, обратный и дополнительный код для положительных чисел совпадают.
- 2. А > 0 и В < 0, В > А. Аналогично предыдущему случаю, результат получается в дополнительном коде.
- 3. А > 0 и В < 0, В < А. Результат получается в прямом коде, но прибавление единицы к модулю результата, как в случае обратных кодов, не выполняется — происходит отброс переноса.
- 4. А < 0 и В < 0. Аналогично предыдущему случаю (выполняется отброс переноса), результат получается в дополнительном коде.
Пример 3.7. Выполнить операции сложения из примера 3.6 в дополнительном коде.
Решение. Первые два случая, когда происходит переполнение разрядной сетки, были рассмотрены ранее. Сложение положительных чисел (случай 1) аналогично сложению в обратных кодах (рис. 3.7, а).
Выполнение сложений г) е) приведено на рис. 3.8.
Рис. 3.8. Сложение чисел в дополнительном коде.
На рис. 3.8, а указано вычисление 40ю + (—60ю) (случай 2): результат получается в дополнительном коде. После перевода в прямой код имеем представление 40ю+(—60ю) как 1001 0100 = —20ю.
Операция 60ю + (—40ю), выполненная в дополнительных кодах, приведена на рис. 3.8, б. Выполняется отброс переноса в знаковом разряде, поэтому в знаковый разряд помещается значение 0.
Сложение —60ю + (—40ю) приведено на рис. 3.8, в. В этом случае выполняется отброс переноса и результат представлен в дополнительном коде. После перевода имеем верный ответ: — 60i0-I- (—40ю) представляется как 1110 0100, что соответствует значению -1001О. ?
Операция вычитания сводится к выполнению операции сложения. Переход между операциями осуществляется, но привычным правилам:
В зависимости от представления отрицательных чисел, возможны рассмотренные выше случаи (для обратного и дополнительного кодов).