www.chms.ru - вывоз мусора в Балашихе 

Динамо-машины  Обратные коды 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 [ 110 ] 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189

равенства \В\ = [С[ является появление в обоих случаях единицы на выходе переноса старшего разряда сумматора. Действительно, при равенстве [BI = 1С и только при равенстве \В\ = \С\ получим

(1 - В[)+ С gt;..1

(1 Id)-Ь [Б gt; 1.

Если бы при формировании цифр переноса по всем разрядам на вход переноса младшего разряда каждый раз посылался бы нуль, то признаком равенства \В\ = \С\ было бы, наоборот, отсутствие единицы на выходе переноса старшего разряда в обоих случаях.

Вообще сумматор, в котором формирование цифр переноса может быть отделено от формирования цифр суммы, очень удобен при выполнении сравнений. Мы в этом убедимся еще раз в 3.3.3, когда речь будет идти о сравнении по модулю. Там же, кстати, излагается и еще один метод вьшолнения алгебраического сравнения.

Все тонкости, о которых здесь шла речь, можно уловить, конечно, только в том случае, когда сравнение выделено в отдельную операцию. Если вместо сравнения предполагается выполнять просто вычитание чисел и затем условный переход по знаку разности, то все эти тонкости будут опущены. Как видим, это совсем не эквивалентная замена

3,3,3. Выполнение сравнения по модулю чисел с фиксированной запятой. Сравнение по модулю производится очень просто в прямых кодах и достаточно сложно в дополнительных кодах. Мы не приводим здесь алгоритмов выполнения сравнения по модулю в дополнительных кодах; в качестве полезного упражнения читатель может попытаться составить их самостоятельно. Ниже речь пойдет только о сравнении по модулю чисел, представленных в прямых кодах.

Один из способов выполнения этой операции состоит в том, что сравнение по модулю сводится к алгебраическому сравнению. Если после приема исходных чисел принудительно установить у всех чисел знак laquo;+ raquo;, то тем самым будут найдены абсолютные величины чисел. Далее их можно сравнивать обычным путем, как выполнялось бы алгебраи-



ческое сравнение. В арифметических цепях и в схеме управления при этом потребуются минимальные усложнения. Но в действительности сравнение по модулю можно выполнить значительно более коротким путем. Сделаем, скажем, так.

Приняв исходные числа в регистры В и С, не обращая внимания на знаки, обратим код одного из чисел (например, В) и выполним двоичные переносы по всем разрядам. Если устройство сумматора не позволяет отделить процесс формирования цифр переноса от образования суммы, то это в общем не играет роли (только ведет к лишней потере времени), потому что нас будет далее интересовать лишь сигнал переноса из старшего разряда и больше ничего. Относительно входа переноса младшего разряда можно поступить любым способом: либо всегда подавать на него laquo;1 raquo;, либо всегда подавать laquo;О raquo;. В первом случае наличие единицы на выходе переноса старшего разряда будет соответствовать. неравенству В lt; С (так как эта единица указывает, что (1 - \В\) + \С\ 1), а отсутствие единицы - неравенству \В\ gt; \С\. Во втором случае наличие единицы на выходе переноса старшего разряда будет соответствовать неравенству В lt;:С, а отсутствие единицы - неравенству Б gt; \С\ (появление единицы переноса из старшего разряда указывает теперь, что (1 -2- - В1)-!--fC gt; 1, а отсутствие единицы - что (1-2- - \В\) + -bJCJ lt; 1, где 2- - вес младшего разряда, (1-2- -В)- обратный код В).

Таким образом, сигнал переноса из старшего разряда является по существу готовым ответом сравнения по модулю.

Интересно, что аналогичный способ можно применить для выполнения алгебраического сравнения в дополнительных кодах. Напомним (см. 1.4.2), что при построении дополнительного кода по второму варианту - когда знак laquo;-Ь raquo; соответствует цифре laquo;1 raquo; в знаковом разряде - изображение любого числа х представляет собой фактически величину 1.-\-х*), записанную прямым кодом в разрядной сетке, включая и разряд знака. Каково бы ни было х.

*) Как и выше, мы здесь полагаем, что запятая фиксирована между разрядом знака и первым из основных разрядов числа. В выражении t -j- единица есть вес знакового разряда.



его изображение 1 + х всегда положительно. Между тем ясно, что сравнение чисел В я С дало бы такой же ответ, как сравнение величин 1 + В и 1 + С. Последнее можно делать по тем же правилам, по которым делается сравнение по модулю чисел, записанных. прямым кодом.

Дополнительный код, построенный по первому варианту, всегда легко превратить в дополнительный код, построенный по второму варианту. Для этого достаточно, например, изменить на противоположную цифру в разряде знака.

Таким образом, алгебраическое сравнение в дополнительных кодах выполняется столь же просто, как сравнение по модулю в прямых кодах. Но это скорее недостаток, а не достоинство дополнительных кодов; как говорилось в 3.3.1, сравнение по модулю является более нужной операцией, чем алгебраическое сравнение, и важно обеспечить простые и быстрые способы выполнения именно для него.

3.3,4, Сравнение чисел с плавающей запятой. Алгебраическое сравнение чисел с плавающей запятой, как и в случае фиксированной запятой, может быть сведено к вычитанию исходных чисел и индикации знака разности. Переполнение разрядной сетки при вычитании с плавающей запятой - случай настолько редкий, что для него не-стоит предусматривать какие-нибудь специальные схемные решения: просто программист должен учитывать, что слишком большие по абсолютной величине числа разных знаков нельзя сравнивать, так же как нельзя вычитать их одно из другого. Получение нуля при вычитании с плавающей запятой всегда связано с определенными отличиями в процессе нормализации результата (см. 3.2.4); при этом изображение нуля устанавливается в регистре результата искусственным путем, вследствие чего оно всегда однозначно. Следовательно, и с этой стороны трудностей не предвидится. Таким образом, алгебраическое сравнение с плавающей запятой фактически ничем не отличается от вычитания с плавающей запятой с последующим переходом. по знаку результата.

Поскольку мантиссы чисел с плавающей запятой изо-, бражаются обычно прямыми кодами, изменение алгебраического знака числа заключается в изменении в нем только разряда знака мантиссы. Поэтому выполнение сравнения



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 [ 110 ] 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189