Жмакин А.П. Архитектура ЭВМ (2006) (1186252), страница 12
Текст из файла (страница 12)
log210≈3,32, (3.31)
для представления одной десятичной цифры требуется не менее четырех двоичных разрядов. Соответствие между десятичной цифрой и ее двоичным представлением называют двоичным кодом десятичной цифры. Наиболее естественным представляется кодирование десятичных цифр позиционными двоичными кодами с естественными весами разрядов. Такой код принято называть кодом "8421".
Ясно, что это далеко не единственный способ кодирования десятичных цифр. Используя только четырехразрядные двоичные коды, следует выбрать 10 из шестнадцати возможных комбинаций для представления цифр. Количество способов, которыми могут быть выбраны 10 комбинаций из 16, равно числу сочетаний из 16 по 10:
После того как выбор комбинаций сделан, можно Р10 =10! способами сопоставить комбинацию десятичной цифре. Таким образом, общее число различных четырехразрядных кодов десятичных цифр составляет
Лб-СЕ-Рю- — •10! = -^*3-10,°. 10!-6! 6!
Практически лишь 5—6 различных кодов используют в ЦВМ для представления десятичных цифр.
Основной недостаток кодирования десятичных цифр в коде "8421" состоит в несоответствии веса десятичного и шестнадцатеричного переносов. Действительно, перенос из тетрады шестнадцатеричной цифры имеет вес 16, а десятичный перенос —10.
Для устранения этого противоречия можно выбрать другие способы кодирования десятичных цифр. Например, код "8421+3" (иногда его называют код с избытком три) позволяет при сложении получать сумму "с избытком 6", при этом вес переноса соответствует десятичному.
Можно подобрать такие веса двоичных разрядов при кодировании десятичных цифр, чтобы их сумма равнялась 10. Например, код "5211" обладает именно таким свойством. При этом, однако, нарушается свойство функциональности соответствия десятичных цифр и их двоичного представления. Например, цифра 7 может быть представлена как 1100 или как 1011. Для пр одоления этого недостатка достаточно договориться, чтобы в подобных ситуациях всегда сначала заполнялись младшие разряды кода. И табл. 3.5 приведены упомянутые двоичные коды десятичных цифр.
Цифры | Код "8421" | Код "8421+3" | Код "5211" |
0 | 0000 | ООП | 0000 |
1 | 0001 | 0100 | 0001 |
2 | 0010 | 0101 | ООН |
3 | 0011 | 0110 | 0101 |
4 | 0100 | 0111 | 0111 |
5 | 0101 | 1000 | 1000 |
6 | 0110 | 1001 | 1001 |
7 | 0111 | 1010 | 1011 |
8 | 1000 | 1011 | 1101 |
9 | 1001 | 1100 | 1111 |
Арифметические операции над десятичными числами можно выполнять на специальных десятичных сумматорах (в этом случае можно примен любую кодировку десятичных цифр), так и на обычных двоичных сумма pax. В последнем случае десятичные числа обрабатываются по правилам дв ичной арифметики, и десятичный результат операции, естественно, нуждается в коррекции. В этом случае сложность коррекции и длительность ее реализации существенно зависят от выбранного кода.
3.11.2. Арифметические операции над десятичными числами
Рассмотрим выполнение операции сложения десятичных чисел в коде "8421 по правилам двоичной арифметики.
Пример 3.26
Результат — на рис. 3.35.
Из рассмотренного примера видно, что тетрады результата (назовем его предварительным), обрамленные рамкой, нуждаются в коррекции. Действительно, если сумма тетрад, представляющих соответствующие десятичные разряды слагаемых, больше 9, но не превышает 15, двоичный перенос в следующую тетраду не формируется. В этом случае требуется выработать искусственный перенос и удалить из тетрады 10, что соответствует добавлении шестерки (ОНО) и передаче обязательно возникающего при этом переноса в следующий старший разряд.
Если из тетрады был двоичный перенос (в примере он отмечен знаком <-), то он "унес" из тетрады 16, в то время как десятичный перенос должен "уносить" только 10. Следовательно, в такие тетрады, из которых был перенос, следует добавить шестерку (0110).
Таким образом, коррекция предварительной двоичной суммы при использовании кода "8421" заключается в добавлении кода ОНО ко всем тетрадам предварительной суммы, значение которых превышает 9 или из которых был двоичный перенос. Возникающие при коррекции переносы должны обязательно передаваться в следующую старшую тетраду. Выполним операции примера 3.26 с учетом сформулированных правил коррекции.
Пример 3.27
Рассмотрим еще один пример арифметического сложения в коде "8421".
Пример 3.28
Результат — на рис. 3.37
Из примера 3.28 видно, что межтетрадные переносы, возникающие в процессе коррекции предварительной суммы, могут таким образом изменить старшие тетрады, что их также потребуется корректировать. В худшем случае количество последовательных коррекций будет равно разрядности слагаемых (рассмотрите пример сложения 9999 + 1 в коде "8421").
На основании вышеизложенного можно отметить следующие недостатки применения кода "8421":
□ необходимо отслеживать не только переносы из тетрад, но и значения модулей тетрад предварительной суммы;
□ в общем случае невозможно произвести одновременно коррекцию во всех тетрадах, где может потребоваться коррекция.
Для преодоления отмеченных выше недостатков можно использовать другие коды, например "8421+3". При кодировании с избытком три каждая десятичная цифра представляется как a\ = at + ООП , где а, — код "8421" цифры.
Тогда при сложении
где сн — предварительная сумма, в тетраде всегда будет формироваться истинное значение десятичного переноса — для всех комбинаций десятичных слагаемых, для которых а, + Ьх + > 0, значение а\ + Ь\ + > 15 . Однако если переноса из тетрады не было, то результат сформируется "с избытком 6", поэтому потребуется коррекция тетрады предварительной суммы — удаление из тетрады лишней тройки. Вычитание (-3 ) можно заменить сложением с дополнением до 3 — ( + 13). Обязательно возникающий при этом перенос не передается в следующую тетраду. Потеря переноса равносильно потере 16, т. е. -16 + 13 = -3.
Если перенос из тетрады был, то его вес равен 24 =16, таким образом, из тетрады удаляется 16, а вес десятичного переноса— 10. Поэтому перенос из тетрады в коде "8421+3" уносит из тетрады лишнюю шестерку, которую и нужно добавить при коррекции. Но согласно (3.32) сложение тетрад "с избытком 3" приводит к получению суммы "с избытком 6", поэтому вместо добавления шестерки достаточно добавить тройку.
Итак, коррекции при сложении в коде "8421+3" подлежат все тетрады предварительной суммы, причем к тем тетрадам, из которых сформировался перенос, следует добавить константу ООП, а к тетрадам, из которых не было переноса, добавить константу 1101. Возникающие при коррекции межтетрадные переносы игнорируются!
Таким образом, коррекция при сложении в коде "8421+3", во-первых, определяется только значениями переносов из тетрад предварительной суммы и, во-вторых, может проводиться параллельно во всех тетрадах.
Пример 3.29
Результат — на рис. 3.38.
Еще одним достоинством кода "8421+3" является простой способ получения дополнения до 9 — достаточно просто проинвертировать разряды кода.
Действительно, проинвертировав все разряды четырехразрядного двоичного числа а, мы получим его дополнение до 1111 = 1510, что в коде "с избытком 3 " соответствует 15 - (я + 3) = (9 - а) + 3.
Это свойство позволяет довольно просто реализовать операцию вычитания через сложение в обратном или дополнительном коде.
3.12. Машинная арифметика в остаточных классах
Органическим недостатком любой позиционной системы счисления является наличие межразрядных связей. Действительно, результат сложения в /-м разряде зависит не только от значений / -х разрядов слагаемых, но и от переноса из /-1 разряда и, в конечном итоге — от значений всех младших разрядов слагаемых: z'-l, i-2,1, 0. Поэтому вычисление разрядов суммы может проходить только последовательно (с учетом формирования переноса из предыдущего (младшего) разряда. Это обстоятельство препятствует распараллеливанию процесса вычисления и, естественно, снижает быстродействие процессора.
В рамках позиционных систем счисления известно [2, 8, 11] несколько способов логического и схемотехнического ускорения арифметических операций — параллельный перенос, матричная и табличная арифметика и др., однако все они требуют весьма значительных аппаратных затрат.
Поиск новых путей построения арифметических устройств ЭВМ, позволяющий исключить зависимость между разрядами при выполнении арифметических операций, привел к применению в машинной арифметике аппарата теории вычетов— одного из разделов теории чисел. В рамках этого аппарата разработана [1] непозиционная система счисления— система счисления в остаточных классах (СОК).
3.12.1. Представление чисел в системе остаточных классов
Будем говорить, что " а есть остаток числа А по модулю р" (иногда говорят, что " А сравнимо с а по модулю р "), если имеет место следующее равенство:
где
— целая часть частного А/р , причем а — наименьший целый остаток от деления А на р .