Деление без восстановления остатка

Прямой код

Сформулируем правила выполнения операций сложения и вычитания чисел со знаками (такие операции принято называть алгебраическими). Во-первых, алгебраическое вычитание всегда можно свести к алгебраическому сложе­нию, изменив знак второго операнда. Далее следует сравнить знаки слагае­мых. При одинаковых знаках складывают модули слагаемых и результату присваивают знак любого слагаемого (они одинаковые). Если знаки слагае­мых разные, то из большего модуля слагаемого вычитают меньший модуль и присваивают результату знак слагаемого, имеющего больший модуль.

Рассмотрим случай сложения чисел с разными знаками. Он сводится к вычи­танию модулей слагаемых, причем уменьшаемым должен стать больший мо­дуль. Чтобы избежать дополнительной модульной операции сравнения, мож­но произвести "наугад" вычитание А-В . Признаком того, что |А| >|B|будет отсутствие заема из нулевого в первый разряд. Поскольку рассматривается случай разных знаков слагаемых, то при отсутствии заема значение знакового разряда разности определится как 0-1 = 1-0 = 1, а при наличии заема 0-1-1 = 1-0-1 = 0. Таким образом, если при вычитании а-в получим с0=1, это будет означать, что |A|>|B|, и результату следует присвоить знак числа а 0 :=а0). Если окажется с0 =0, то |A|<|B|, и следует осуще­ствить вычитание в-а, присвоив результату знак числа в 0 :=ь0).

Почему обратный и дополнительный код:

При выполнении алгебраического сложения в прямом коде приходится, во-первых, не только складывать, но и вычитать двоичные коды; во-вторых, код знака результата формируется искусственно, т. е. знаковые разряды обраба­тываются по правилам, отличным от правил обработки разрядов числа. Для устранения отмеченных недостатков в ЭВМ широко используются специаль­ные представления двоичных чисел — т. н. обратный и дополнительный коды.

Сложение в обратном коде

1. а>0, в>0, а + в<1

2. а>0, в<0, а + в>0 (коррекция)

3. а>0, в<0, а + в<0

4. а<0, в<0, |а + в|<1 (коррекция)

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

Таким образом, признаком переполнения в обратном коде можно считать знак результата, противоположный одинаковым знакам слагаемых:

 

Итак, использование обратного кода в операциях алгебраического сложе­ния/вычитания позволяет:

□ использовать только действие арифметического сложения двоичных кодов;

□ получать истинное значение знака результата, выполняя над знаковыми разрядами операндов те же действия, что и над разрядами чисел;

□ обнаруживать переполнение разрядной сетки.

Еще одним достоинством применения обратного кода можно считать просто­ту взаимного преобразования прямого и обратного кода.

Однако использование обратного кода имеет один существенный недоста­ток — коррекция предварительной суммы требует добавления единицы к ее младшему разряду и может вызвать (в некоторых случаях) распространение переноса по всему числу, что, в свою очередь, приводит к увеличению вдвое времени суммирования. Для преодоления этого недостатка можно использо­вать вместо обратного дополнительный код.

Дополнительный код

1. а>0, в>0, а + в<1

2. а>0, в<0, а + в>0 (коррекция)

3. а>0, в<0, а + в<0 (коррекция)

4. а<0, в<0, |а + в|<1 (коррекция)

Сложить два числа в дополнительном коде: (-11/16) + (-5/16) = (-16/16). Результат — на рис. 3.20.

Переполнение по признакам выражения (3.19) не обнаружено! Однако ре­зультат операции — "отрицательный ноль", который не может использоваться

в дополнительном коде. Действительно, сложение в дополнительном коде любого числа с "отрицательным нулем" 1.00...0 меняет знак этого числа. Итак, при а<0, в<0, |а + в|=1 признаком переполнения служит не выраже­ние (3.19), а код результата 1, 00...0.

Таким образом, значение признака переполнения в дополнительном коде можно получить в соответствии со следующим выражением:

Подведем итоги. Применение дополнительного кода, по сравнению с обрат­ным, имеет одно существенное преимущество — коррекция результата сводится просто к отбрасыванию переноса из знакового разряда и не требует дополнительных затрат времени. К недостаткам применения дополнительного кода можно отнести, во-первых, более сложную про­цедуру взаимного преобразования ПК <-» ДК, требующую дополнительных затрат времени, и, во-вторых, проблемы с обнаружением переполнения. Для того чтобы минимизировать влияние первого недостатка, данные в памяти часто хранят в дополнительном коде. В этом случае преобразо­вания ПК <-> ДК выполняются относительно редко — только при вводе и выводе.

Алгебраическое сложение/вычитание

 



Где:

 , b 0 — знаковые разряды слагаемых;

□ с0 — код знака результата;

 , bj, — двоичные переменные;

□ f — тип выполняемой операции: f = 0 — сложение, f = 1 — вычи­тание;

□ OV — признак переполнения,

□ А' =  —модули чисел;

— перенос из знакового разряда;

 — ситуации переполнения в дополни­тельном коде.

 

Умножение в прямом коде

Умножение двоичных чисел со знаком удобнее всего проводить в прямом коде. Действительно, знак произведения не зависит от соотношения величин модулей сомножителей, а зависит только от их знаков:

В изображенном на рис. 3.23 алгоритме, в отличие от алгоритмов сло­жения/вычитания, значение OV0 устанавливается безусловно. Действительно, А и В — дробные числа; очевидно при |A|<1 и |B|<1 всегда |А∙B|<1.

Алгоритмы деления

Знак частного, как и знак произведения, не зависит от соотношения модулей операндов и определяется в зависимости от знаков операндов по выражению (3.25). Поэтому рассмотрим сначала процесс деления модулей двоичных чисел.

Пусть А — делимое, В — делитель, С — частное, W — остаток.

Очевидно, при представлении чисел с фиксированной запятой как дробных, должно соблюдаться условие

|A|<|B|                      (3.29)

Сформулируем словес­ный алгоритм деления следующим образом:

1. Вычетают из делимого делитель. Если знак разности 0, то деление невоз­можно в силу нарушения условия (3.29), и следует, установив OV= 1, за­вершить операцию; иначе в разряд целой части частного записывают О (в конце операции в этот разряд помещается знак частного).

2. Так как остаток (разность А-В) оказался отрицательным, восстанавли­вают остаток путем добавления делителя к остатку.

3. Сдвигают восстановленный остаток влево на один разряд.

4. Вычитают из сдвинутого остатка делитель; если полученная разность по­ложительна, то очередной цифрой частного становится 1, и следует перей­ти к п. 3; иначе очередная цифра частного — 0 и переходят к п. 2.

Пункты 2—4 повторяют столько раз, сколько цифр требуется получить в частном.

Деление дробных положительных чисел + (3/16):+(12/16) = +(1/4) = +(4/16) приведено на рис. 3.29.

Деление без восстановления остатка

Приведенный выше метод деления называется методом деления с восстанов­лением остатка. При получении отрицательного остатка на очередном шаге деления необходимо перед левым сдвигом восстановить остаток путем до­бавления к нему делителя. При этом для получения п -разрядного частного требуется в среднем 1,5и циклов сложения/вычитания.

Существует алгоритм деления без восстановления остатка, позволяющий корректировать отрицательные остатки без дополнительного цикла сложе­ния. Рассмотрим действия, производимые с остатками в цикле деления в за­висимости от полученного знака остатка (табл. 3.4).

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

 вместо вычитания делителя из сдвинутого остатка добавить делитель к сдвину­тому остатку.

Действительно, если W - В < 0, то следует восстановление остатка и сдвиг восстановленного остатка влево (его удвоение) 2-( W - B + В). На сле­дующем шаге вычитаем делитель и получаем 2 W - B . Тот же результат может быть получен, если сдвинуть невосстановленный остаток, но на следующем шаге вместо вычитания произвести добавление делителя: 2{ W - B ) + B = 2 W -2 B + B = 2 W + B .


Дата добавления: 2018-09-22; просмотров: 1752; Мы поможем в написании вашей работы!

Поделиться с друзьями:




Мы поможем в написании ваших работ!