
- •Содержание
- •Часть I. Арифметика в форматах с фиксированной точкой
- •1. Введение
- •Место и роль Арифметики цифровых вычислительных машин в современной науке
- •Предмет и предназначение настоящей книги
- •Рекомендации читателю
- •Раздел 2 достаточно просмотреть, быстро переворачивая страницы.
- •Позиционные системы счисления
- •Двоичная, восьмеричная, шестнадцатеричная и двоично-кодированные системы счисления
- •Преобразование чисел из десятичной в двоичную, восьмеричную и шестнадцатеричную системы счисления и наоборот
- •Представление чисел в форматах с фиксированной точкой
- •Формат с фиксированной точкой
- •Свойства формата с фиксированной точкой
- •Ограниченный диапазон представления чисел
- •Точность действительного числа в формате и точность формата
- •Значимость числа и потеря значимости
- •Эффективность использования двоичного формата
- •Представление чисел в прямом, обратном и дополнительном кодах
- •Взаимное преобразование прямого, обратного и дополнительного кодов
- •Взаимное преобразование прямого и обратного кодов отрицательных чисел
- •Взаимное преобразование обратного и дополнительного кодов отрицательных чисел
- •Взаимное преобразование прямого и дополнительного кодов отрицательных чисел
- •Запись кода числа в формат с фиксированной точкой
- •Функции системы записи и исключительные ситуации
- •Округление действительных чисел
- •Округление кодов действительных чисел с записью в формат с фиксированной точкой
- •Округление прямого кода числа
- •Округление обратного и дополнительного кодов положительного числа
- •Округление обратного кода отрицательного числа
- •Округление дополнительного кода отрицательного числа
- •Арифметические операции в форматах с фиксированной точкой
- •Операция пересылки
- •Операция изменения знака
- •Операции алгебраического сложения и вычитания
- •Сложение в дополнительном коде
- •Вычитание в дополнительном коде
- •Особенности сложения и вычитания в дополнительном коде
- •Сложение в обратном коде
- •Вычитание в обратном коде
- •Особенности сложения и вычитания в обратном коде
- •Взаимная замена операций вычитания и сложения
- •Сложение и вычитание в прямом коде
- •Операция алгебраического умножения
- •Умножение в прямом коде
- •Умножение в дополнительном коде
- •Умножение с преобразованием операндов в прямой код и произведения в дополнительный
- •Умножение дополнительного кода множимого на модуль множителя
- •Умножение дополнительного кода множимого на дополнительный код множителя
- •Умножение множимого в традиционной двоичной системе на множитель, представленный в двоичной системе счисления с алфавитом
- •Умножение дополнительных кодов с заменой знакового разряда множителя 1 на
- •Преобразование множителя с заменой цепочек единиц нулями
- •Преобразование множителя с сокращением вдвое верхней оценки количества единиц
- •Умножение на два разряда с переносом 1 в очередную двойку разрядов множителя
- •Умножение на два разряда с преобразованием множителя заменой цепочек единиц нулями
- •Умножение на два разряда множителя с увеличенным количеством нулевых частных произведений
- •Изменение операции над частным произведением
- •Вычисление частного произведения с требуемым знаком
- •Сокращение матриц дополнительных кодов частных произведений
- •Табличный способ умножения
- •Умножение чисел большой разрядности
- •Операции алгебраического деления и вычисления остатка
- •Математические основы некоторых способов деления двоичных чисел
- •Деление двоичных чисел в прямом коде
- •Деление с восстановлением остатка
- •Деление без восстановления остатка
- •Деление с вычислением очередного сдвинутого влево остатка
- •Деление без записи очередного остатка на место предыдущего
- •Деление двоичных чисел в дополнительном коде
- •Деление нормализованных двоичных чисел
- •Некоторые способы ускорения деления
- •Операция сравнение
- •Выполнение операций в двоично-десятичной системе счисления
- •Вычисление двоично-десятичного кода обратной десятичной цифры
- •Взаимные преобразования прямого, обратного и дополнительного кода двоично-десятичного числа
- •Изменение знака двоично-десятичных чисел
- •Сложение двоично-десятичных чисел
- •Сложение в двоично-десятичной системе 8421
- •Вычитание двоично-десятичных чисел
- •Литература
Взаимное преобразование обратного и дополнительного кодов отрицательных чисел
При преобразовании необходимо учитывать вариант применяемого дополнительного кода (раздел 3.2)
При преобразовании код знака должен измениться в единственном случае, когда выполняется преобразование обратного кода отрицательного нуля в дополнительный код (вариант кода B или C), т.к. в этих вариантах ноль может быть записан только как (+0).
Дополнительный код 1|00...0 в варианте A кодирует -0. При преобразовании в обратный код цифры в значащих разрядах кода 1|00...0 следует заменить обратными.
Дополнительный код 1|00...0 в варианте B не может быть преобразован в обратный код без расширения формата обратного кода. Если исходный дополнительный код 1|00...0 и длина формата должна оставаться прежней, формируют признак исключительной ситуации переполнения формата. Выполнение программы вычислений прерывают.
Если код 1|00...0 не применяется при представлении числа в дополнительном коде (вариант кода C), то операция преобразования кода 1|00...0 в обратный код невыполнимая. В этой исключительной ситуации формируют признак невыполнимая операция и выполнение программы прерывают.
При преобразовании решаются две задачи: вычисляются код знака числа и код его значащих разрядов. Каждая задача может быть решена несколькими способами. Их сочетания порождают варианты способов преобразования.
Рассмотрим преобразования кодов при представлении чисел в дополнительном коде в вариантах A или С.
Преобразование кода значащих разрядов числа.
Способ 1.
Так как количественные эквиваленты обратного и дополнительного кодов значащих разрядов отрицательного числа связаны с количественными эквивалентами прямого кода значащих разрядов отношениями
;
то
(3-14)
(3-15)
Поскольку
,
то вычисление кода значащих разрядов
сводится к увеличению (3-14) или к уменьшению
(3-15) исходного кода на 1 младшего разряда,
причем перенос/заем, формируемый в
старшем значащем разряде, игнорируют.
При вычислении
значащих разрядов дополнительного кода
перенос из старшего значащего разряда
равен 1 только при
(во всех значащих разрядах обратного
кода цифры обратные 0). Игнорирование
переноса равного 1 эквивалентно вычитанию
в выражении (3-14).
При вычислении значащих разрядов обратного кода (3-15) в старшем значащем разряде может получиться заем 1, только при исходном коде 1|00…0. Если он применяется для кодирования (вариант A), то игнорирование займа сохранит код знака 1, а цифры во всех значащих разрядах изменятся на обратные 0, что и требуется. Если код 1|00…0 не кодирует число (вариант C), то складывается исключительная ситуация невыполнимая операция. Поэтому преобразование выполнять не следует.
Способ 2.
Справедливы следующие отношения
(3-16)
(3-17)
Несмотря на
кажущееся существенным усложнение
формул, вычисление кода значащих разрядов
выполняется сравнительно просто. При
вычитании (прибавлении) константы
,
являющейся цепочкой максимальных цифр
алфавита, например в десятичной системе
99…9, игнорируют заем/перенос, формируемый
в старшем значащем разряде, и тем самым
прибавляют (вычитают) константу
.
При вычислении
значащих разрядов дополнительного кода
(3-16) значащие разряды обратного кода
при
имеют значение
.
Поэтому вычитание константы
с игнорированием займа равного 0 приведет
к результату, содержащему 0 во всех
значащих разрядах, что и требуется.
При вычислении
значащих разрядов обратного кода (3-17)
и дополнительном коде не равном 1|00…0
перенос из старшего значащего разряда
равен 1. Игнорирование переноса равносильно
вычитанию из результата сложения
константы
.
Если дополнительный код 1|00…0 кодирует
,
то прибавление константы
с игнорированием переноса из старшего
разряда равного 0 заменит код в значащих
разрядах на
,
что и требуется. Если применяется вариант
C
дополнительного кода, то при исходном
коде равном 1|00…0 складывается
исключительная ситуация невыполнимая
операция.
Поэтому преобразование выполнять не
следует.
Способы преобразования кода знака числа.
Существует множество правил определения кода знака результата преобразования. При конструировании правила следует учесть, что при преобразовании
дополнительного кода в обратный знак не должен измениться;
обратного кода в дополнительный знак должен измениться только в случае, когда обратный код кодирует число (-0) и применяется вариант B или С дополнительного кода.
Рассмотрим выполнение преобразований на примерах.
П
A B C D E
P=10 P=10 P=10 P=2 P=2 Заем:
0
00
0 0
01
1 0
00
0 0
000 0
000 Xдоп:
1|00|01
(–99,99) 1|36|00
(–64,00) 1|99|99
(–00,01) 1|0001
(–15) 1|1111
(–1)
–
1 –
1 –
1 –
1 –
1 Xобр:
1|00|00
(–99,99) 1|35|99
(–64,00) 1|99|98
(–00,01) 1|0000
(–15) 1|1110
(–1)
Если исходный код 1|00…0 кодирует число -0 (вариант кода А), то игнорирование займа из знакового разряда сохранит код знака, а цифры в значащих разрядах изменятся на обратные, что и требуется.
Если исходный код не может иметь значение 1|00…0 (вариант кода С), то при вычитании заем из знакового разряда всегда равен 0. Это позволяет вычислять обратный код, не игнорируя заем из знакового разряда.
При этом способе вычисления значащих разрядов обратного кода отрицательного числа код знака результата можно принимать равным:
коду знака исходного кода, так как знаки будут всегда совпадать;
1, так как результат преобразования не может быть положительным;
инверсии займа из знакового разряда (в варианте кода С), так как заем не может быть равным 1.
Преобразование дополнительного кода числа (варианты кода A и C) с любым знаком в обратный код можно выполнить вычитанием знака числа из младшего разряда. Если число положительное, то вычитание 0 не изменит значение кода. Если число отрицательное, то будет вычитаться 1 из младшего разряда как в примере 3-6.
П
A B C D E
P=10 P=10 P=10 P=2 P=2 Перенос:
Xдоп: 1|00|01
(–99,99) 1|36|00
(–64,00) 1|99|99
(–00,01) 1|0001
(–15) 1|1111
(–1)
+
99 99 +
99
99 +
99
99 +
1111 +
1111
Xобр: 1|00|00
(–99,99) 1|35|99
(–64,00) 1|99|98
(–00,01)
1|0000
(–15)
1|1110
(–1)1
11
1
1
10
0 1
11
1 1 111 1
111
При этом способе вычисления значащих разрядов обратного кода отрицательного числа код знака результата можно принимать равным:
коду знака исходного кода, так как знаки будут всегда совпадать;
1, так как результат преобразования не может быть положительным.
В двоичной системе счисления преобразование дополнительного кода числа (вариант кода С) с любым знаком в обратный код можно выполнить сложением знака числа с каждым разрядом исходного кода, отбрасывая перенос из знакового разряда. Так как исходный код не может иметь значение 1|00…0, то при сложении знак числа сохраняется.
Например:
Перенос:
Xдоп:
1|0011 (–13) 0|1101
(+13)
+
1
1111
+
0
0000
Xобр:
1|0010
(–13) 0|1101
(+13)
1
1 111
0
0 000
В системах счисления с основанием большим, чем 2, цифру знака 1 следует заменить цифрой обратной нулю. Например, в десятичной системе счисления
Перенос:
Xдоп:
1|0001 (–9999) 0|9999
(+9999)
+
9 9999
+
0
0000
Xобр:
1|0000
(–9999) 0|9999
(+9999)
1
1 111
0
0
000
Пример 3-8. Выполнено преобразование обратного кода отрицательных чисел в дополнительный код (варианты B и C) в десятичной и в двоичной системе счисления. Код значащих разрядов вычислен способом 1 (3-14).
О
A B C D E
P=10 P=10 P=10 P=2 P=2 Перенос: 0
00
0 0
01
1 1
11
1 0
000 1
111
Xобр: 1|00|00
(–99,99) 1|35|99
(–64,00) 1|99|99
(–00,00) 1|0000
(–15) 1|1111
(–0)
+
1 +
1 + 1 +
1 +
1
Xдоп: 1|00|01
(–99,99) 1|36|00
(–64,00) 0|00|00
(+00,00) 1|0001
(–15) 0|0000
(+0)
При этом способе вычисления кода значащих разрядов код знака результата можно принимать равным:
инверсии переноса в знаковый разряд;
любой логической функции от знака исходного кода и переноса в знаковый разряд принимающей на наборе 10 (знак исходного кода, перенос в знаковый разряд) значение 1 и на наборе 11 значение 0;
1, если все значащие разряды исходного кода не содержат цифры с максимальным количественным эквивалентом; в противном случае 0.
Дополнительный код числа с любым знаком можно получить прибавлением знака числа к младшему разряду обратного кода с отбрасыванием переноса из разряда знака.
Для преобразования обратного кода отрицательных чисел в дополнительный код (вариант кода A) достаточно игнорировать перенос в знаковый разряд. Это приведет к сохранению знака отрицательного нуля и замене цифр обратных нулю на 0, что и требуется.
П
A B C D E
P=10 P=10 P=10 P=2 P=2 Заем:
1
11 1 1
10 0 0
00 0 1 111 0
000 Xобр: 1|00|00
(–99,99) 1|35|99
(–64,00) 1|99|99
(–00,00) 1|0000
(–15) 1|1111 (–0)
– 99 99 –
99
99 –
99 99 –
1111 –
1111 Xдоп: 1|00|01
(–99,99) 1|36|00
(–64,00) 0|00|00
(+00,00) 1|0001
(–15) 0|0000
(+0)
Обратите внимание на изменение знака при преобразовании обратного кода (–0) в вариантах примера C и E.
При этом способе вычисления кода значащих разрядов код знака результата можно принимать равным:
займу из знакового разряда;
любой логической функции от знака исходного кода и займа из знакового разряда принимающей на наборе 10 (знак исходного кода, заем) значение 0 и на наборе 11 значение 1;
1, если все значащие разряды не содержат цифру с максимальным количественным эквивалентом; в противном случае 0.
В
Заем:
Xобр: 1|0000
(–15) 1|1011
(–4) 1|1111
(–0) 0|1011
(+11)
– 1 1111
–
1
1111
–
1 1111
–
0 0000
Xдоп: 1|0001
(–15) 1|1100
(–13) 0|0000
(+0) 0|1011
(+11)11
111
1
1 100
0
0 000
0
0
000
Если числу (-0) в дополнительном коде приведен в соответствие код 1|00…0 (вариант кода A), то при преобразовании обратного кода в дополнительный достаточно вычитать цифру знака только из значащих разрядов обратного кода и игнорировать заем из знакового разряда.
Как отмечалось
выше, преобразование дополнительного
кода (вариант кода B)
в обратный код с сохранением длины
формата приводит к исключительной
ситуации переполнения
формата
результата, если дополнительный код
имеет значение 1|00…0 (
).
Чтобы избежать переполнения
формата,
достаточно расширить поле значащих
разрядов обратного кода на один разряд
слева. Это можно сделать, например, так.
Расширить поле значащих разрядов
исходного дополнительного кода на
разряд влево, не изменяя значение
кодируемого числа. Для этого, если код
знака 0, в расширяющий разряд записать
0. Иначе записать цифру
.
Выполнить преобразование расширенного
дополнительного кода в обратный код
любым рассмотренным способом.
Например, в двоичной
системе счисления
.
Выполним преобразование расширенного
дополнительного кода в обратный код
вычитанием цифры знака из младшего
разряда. Получим:
В
Xдоп:
1|0000
(–16) 1|1010
(–6) 0|1111
(+15) 0|0000
(+0) Расшир: 1|10000 1|11010 0|01111 0|00000
–
1 –
1 –
0 –
0
Xобр: 1|01111
(–16) 1|11001
(–6) 0|01111
(+15) 0|00000
(+0)
Xпр: 1|10000
(–16) 1|00110
(-6) 0|01111
(+15) 0|00000
(+0)
.
Выполним преобразование расширенного
дополнительного кода в обратный код
тем же способом, что и в примере 3-7.
Получим:
Xдоп:
1|0000
(–10 000) 1|3600
(–6400) 0|9999
(+9999) 0|0000
(+0) Расшир: 1|90000 1|93600 0|09999 0|00000
+ 99999 +
99999 +
0 +
0
Xобр: 1|89999
(–10 000) 1|93599
(–6400) 0|09999
(+9999)
0|00000
(+0)
Xпр: 1|10000
(–10 000) 1|06400
(–6400) 0|09999
(+9999)
0|00000
(+0)