Случай №1

Схема 4

Схема 3

Схема 2

Схема 1

. (4.7)

. (4.8)

Время выполнения операции умножения:

(4.9)

где (tс) — время, затрачиваемое на выполнение операции сдвига на один разряд;

(t+) — время, затрачиваемое на выполнение операции сложения.

. (4.10)

(4.11)

. (4.12)

. (4.13)

. (4.14)

. (4.15)

. (4.16)

. (4.17)

. (4.18)

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

Алгоритм №1. Алгоритм умножения младшими разрядами вперед, со сдвигом суммы ЧП вправо.

1. Исходное значение суммы (ЧП) принимается равным (0), счетчику тактов – (Сч.Т) присваивается значение, равное числу разрядов множителя.

2. Анализируется младшая разрядная цифра множителя. Если она равна (1), то к сумме (ЧП) прибавляется множимое, совмещенное по старшим разрядам; если (0) — прибавление не производится.

3. Производится сдвиг множителя и суммы ЧП вправо на (1) разряд. Содержимое (Сч.Т) уменьшается на (1).

4. Анализируется содержимое (Сч.Т). Если оно не равно (0), то переход к (п.2), иначе — (п.5).

5. Умножение закончено, младшая часть произведения находится на месте множителя, а старшая — на месте суммы (ЧП). Например: необходимо перемножить два беззнаковых числа (7∙3=21). Для удобства возьмем длину разрядной сетки равную четырем битам, а именно: Х = 7 – множимое, Y = 3 – множитель, Z = 21 – произведение. Если (X) и (Y) равняется четырем битам, то как было отмечено выше (Z) должно быть восьмиразрядным значением, т.е длина разрядной сетки произведения в два раза больше множимого и множителя. Алгоритм умножения приведен в табл. 4.1.

Таблица 4.1 - Алгоритм умножения со сдвигом вправо двоичных беззнаковых чисел

Регистр (В) множимое X Регистр (С) множитель Y Регистр (А) произведение Z Счетчик тактов (Сч.Т) Комментарии
                     
        множимое
        1Я СЧП
              1ЫЙсдвиг СЧП
        множимое
        2Я СЧП
              2 ОЙсдвиг СЧП
              3 ИЙсдвиг СЧП
              4ЫЙсдвиг СЧП
    СТОП    
                     

Алгоритм №2. Алгоритм умножения старшими разрядами вперед, со сдвигом суммы ЧП влево.

1. Исходное значение суммы (ЧП) принимается равным (0), (Сч.Т) присваивается значение, равное числу разрядов множителя.

2. Производится сдвиг суммы (ЧП) влево на (1) разряд.

3.Анализируется старшая разрядная цифра множителя. Если она равна (1), то к сумме (ЧП) прибавляется множимое, совмещенное по младшим разрядам; если (0) — прибавление не производится.

4.Производится сдвиг множителя влево на (1) разряд. Содержимое (Сч.Т) уменьшается на (1).

5.Анализируется содержимое (Сч.Т). Если оно не равно (0), то переход к (п.2), иначе — (п.6).

6.Умножение закончено, произведения находится на месте суммы (ЧП), которая имеет удвоенную разрядность. Например: необходимо перемножить два беззнаковых числа (7∙3=21). Для удобства возьмем длину разрядной сетки равную четырем битам, а именно: Х = 7 – множимое, Y = 3 – множитель, Z = 21 – произведение. Если (X) и (Y) равняется четырем битам, то как было отмечено выше (Z) должно быть восьмиразрядным значением, т.е длина разрядной сетки произведения в два раза больше множимого и множителя. Алгоритм умножения приведен в табл. 4.2.

Таблица 4.2 - Алгоритм умножения со сдвигом влево двоичных беззнаковых чисел

Регистр (В) множимое X Регистр (С) множитель Y Регистр (А) произведение Z Счетчик тактов (Сч.Т) Комментарии
                     
        1ЫЙсдвиг СЧП
              2 ОЙсдвиг СЧП
        3 ИЙсдвиг СЧП
              4ЫЙсдвиг СЧП
        5ЫЙсдвиг СЧП
        множимое
        1Я СЧП
               
              6ОЙ сдвиг СЧП
        множимое
        2Я СЧП
    СТОП    
                     

4.5 Деление двоичных беззнаковых чисел в компьютерных системах

Деление мантисс чисел в форме с фиксированной запятой выполняется над абсолютными величинами операндов, представленными, чаще всего, прямым кодом.

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

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

Как правило, формальным признаком окончания операции деления принимается количество сдвигов: при достижении числа сдвигов, равного количеству разрядов в частном, операция деления завершается.

Обозначим X - делимое, Y - делитель, а Z - частное. Тогда:

. (4.20)

Пусть (X), (Y) и (Z) являются беззнаковыми числами.

Операция деления характеризуется также дополнительным результатом (R) - остатком.

В практической реализации выделяют два типа операции деления:

- первый тип это когда делимое, делитель и частное имеют одну и ту же длину (s);

- второй тип это когда делимое имеет длину (2s) - удвоенную по сравнению с делителем и частным. Рассмотрим случай 1.

, . (4.21)

, . (4.22)

, . (4.23)

, . (4.24)

. (4.25)

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

. (4.26)

или

. (4.27)

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

Переполнение исключено, если делимое и делитель имеют одинаковую длину. Как особый случай переполнения рассматривают попытку деления на нуль.

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

Цифра () частного определяется следующим образом: если текущий остаток () больше или равен делителю, цифра частного равна (1), если меньше, то цифра частного равна (0).

При этом операция сравнения реализуется посредством операции вычитания.

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

- с неподвижным делимым (частичным остатком) и сдвигаемым вправо делителем;

- с неподвижным делителем и сдвигаемым влево делимым (частичным остатком).

В зависимости от способа обработки отрицательного частичного остатка, различают два алгоритма деления:

- алгоритм №1, с восстановлением остатка;

- алгоритм №2 без восстановления остатка.

Деление с восстановлением остатка заключается в следующем, если на очередном шаге получен положительный остаток, то в очередную цифру частного записывается (1), а остаток становится «предыдущим» для следующего шага.

Данный шаг на этом заканчивается.

Рисунок 4.9 - Схемы деления двоичных беззнаковых чисел

Если текущий остаток отрицателен, то в очередную цифру частного записывается (0), а к остатку прибавляется делитель для восстановления предыдущего, сдвинутого влево остатка, который становится «предыдущим» для следующего шага.

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

Алгоритм №1. Деление целых двоичных беззнаковых чисел методом с восстановлением остатка.

1. Исходное значение частного (Z) полагается равным (0). (Сч.Т) присваивается значение (s). Исходное значение частичного остатка (R0) полагается равным (s) старшим разрядам делимого.

2. Выполняется пробное вычитание делителя (Y) из исходного значения частичного остатка – (ЧО). Положительная разность указывает на то, что частное превысит (s-разрядную сетку), и будет выполнено прерывание. Если же результат вычитания отрицательный, то деление можно выполнять.

3. Восстанавливается исходное значение (ЧО) прибавлением делителя к полученному отрицательному остатку.

4. (ЧО) удваивается путем сдвига на один разряд влево.

5. Из (ЧО) вычитается делитель и анализируется знак результата вычитания: если остаток положительный, то очередная цифра частного равна (1), иначе – (0).

6. Частное сдвигается влево с занесением очередной полученной цифры частного в освободившийся младший разряд. (Сч.Т) уменьшается на (1).

7. Если полученный остаток отрицателен, то восстанавливается предыдущий положительный остаток прибавлением делителя к отрицательному остатку.

8. (Пп. 4-7) последовательно выполняются до получения всех цифр частного, пока (Сч.Т) не станет равным (0).

9. Если последний остаток от деления отрицателен, то восстанавливается предыдущий положительный остаток, который будет окончательным остатком от деления.

Недостатки:

- нерегулярность выполнения операций, что усложняет устройство управления (для получения одной цифры частного необходимо выполнять либо одно вычитание и сдвиг, либо одно вычитание, одно сложение и сдвиг);

- относительно малая скорость деления, т.к. в среднем половина шагов будет содержать операцию восстановления остатка.

T=(s+l)(l,5t++tc)–tc.

Например: необходимо разделить два беззнаковых числа (21:7=3).

Для удобства возьмем длину разрядной сетки равную четырем битам, а именно:

Х = 21 – делимое;

Y = 7 – делитель;

Z = 3 – частное.

Если (Z) и (Y) равняется четырем битам, то как было отмечено выше (X) должно быть восьмиразрядным значением, т.е длина разрядной сетки делимого в два раза больше делителя и частного.

Алгоритм деления приведен в табл. 4.3.

Таблица 4.3 - Алгоритм деление целых двоичных беззнаковых чисел методом с восстановлением остатка.

  Регистр (В) делимое X Регистр (С) делитель Y Регистр (А) частное Z Счетчик тактов (Сч.Т)
                                   
                       
          <0            
                       
                       
                             
                       
          <0            
                       
                       
                             
                       
          <0            
                       
                             
                             
                       
          >0            
                       
                       
          >0            
            СТОП    
                                         

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

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

Проанализируем шаг деления, при котором текущий остаток оказался отрицательным. Обозначим:

- () - предыдущий остаток;

- () - текущий;

- () - последующий.

Пусть:

. (4.28)

При этом, в соответствии с правилом деления, должны выполняться три действия:

- восстановление предыдущего (сдвинутого влево) остатка:

. (4.29)

- сдвиг восстановленного остатка влево на один разряд:

. (4.30)

- вычитание модуля делителя из полученной кодовой комбинации:

. (4.31)

Таким образом, требуется перейти от текущего остатка:

. (4.32)

к последующему виду (4.31), избавившись от операции восстановления.

Если первым действием является сдвиг отрицательного остатка () влево, то:

. (4.33)

Правая часть (4.32) отличается от требуемого вида величиной |Y|.

Поэтому вторым действием будет корректировка (4.33):

. (4.34)

Сформулируем общее правило.

Чтобы определить цифру частного в некотором разряде, необходимо сдвинуть логически () влево на один разряд, а затем прибавить к нему код делителя, которому приписывается знак, противоположный знаку предыдущего остатка; если полученный () положительный, то в частном проставляется (1), если же отрицательный, - то (0).

Алгоритм №2. Деления целых двоичных чисел методом без восстановления остатка

1-2. Аналогично п.п. 1, 2 предыдущего.

3. Аналогично п. 4.

4. Из частичного остатка вычитается делитель, если остаток положительный, или к частичному остатку прибавляется делитель, если остаток отрицательный.

5. Частное сдвигается; в младший разряд заносится очередная цифра частного (1 — при положительном остатке, 0 — при отрицательном);

6. П.п. 3-5 последовательно выполняются для получения всех цифр частного, пока (Сч.Т) не станет равен (0).

7. Аналогично последнему пункту предыдущего алгоритма.

Реализация данного алгоритма не требует никаких дополнительных аппаратурных затрат. .

Например: необходимо разделить два беззнаковых числа (21:7=3).

Для удобства возьмем длину разрядной сетки равную четырем битам, а именно:

Х = 21 – делимое;

Y = 7 – делитель;

Z = 3 – частное.

Если (Z) и (Y) равняется четырем битам, то как было отмечено выше (X) должно быть восьмиразрядным значением, т.е длина разрядной сетки делимого в два раза больше делителя и частного.

Алгоритм деления приведен в табл. 4.4.

Таблица 4.4 - Алгоритм деление целых двоичных беззнаковых чисел методом без восстановлением остатка.

  Регистр (В) делимое X Регистр (С) делитель Y Регистр (А) частное Z Счетчик тактов (Сч.Т)
                                   
                       
          <0            
                             
                       
          <0            
                             
                       
          <0            
                             
                       
          >0            
                       
                       
          >0                  
            СТОП          
                                         

Например: необходимо разделить два беззнаковых числа (21:7=3).

Для удобства возьмем длину разрядной сетки равную четырем битам, а именно:

Х = 20 – делимое;

Y = 7 – делитель;

Z = 2 – частное;

R = 6 - остаток.

Если (Z) и (Y) равняется четырем битам, то как было отмечено выше (X) должно быть восьмиразрядным значением, т.е длина разрядной сетки делимого в два раза больше делителя и частного.

Как было отмечено выше последний частичный остаток должен быть больше нуля.

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

Алгоритм деления приведен в табл. 4.5.

Таблица 4.5 - Алгоритм деление целых двоичных беззнаковых чисел методом без восстановлением остатка.

  Регистр (В) делимое X Регистр (С) делитель Y Регистр (А) частное Z Счетчик тактов (Сч.Т)
                                   
                       
          <0            
                             
                       
          <0            
                             
                       
          <0            
                             
                       
          >0            
                       
                       
          <0                  
                  СТОП          
Счетчик тактов равняется нулю деление окончено, но последний частичный остаток получился равен меньше нуля, поэтому необходимо выполнить коррекцию, путем прибавления к последнему частичному остатку делитель.
          - коррекция
          >0 - истинный остаток.
                                         

4.6 Умножение двоичных знаковых чисел в компьютерных системах

При выполнении операции умножения знаковых чисел исходные сомножители могут быть представлены в ПК, ОК или ДК:

. (4.35)

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

. (4.36)

Определение знака произведения показано в табл. 4.5. Где (0) - обозначает (+), а (1) – обозначает (-).

Таблица 4.5 – Определение знака произведения

00=0
01=1
10=1
11=0

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

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

Теорема: произведение дополнительных кодов сомножителей равно дополнительному коду результата только в случае положительных сомножителей. Если хотя бы один сомножитель отрицателен, то произведение чисел на сумматоре дополнительных кодов получается прибавлением поправки () к произведению дополнительных кодов сомножителей. Рассмотрим арифметическое обоснование алгоритмов первой группы при различных вариантах комбинаций знаков операндов. С этой целью у операндов отбрасывается знаковая цифра и выполняется умножение полученных псевдомодулей по одному из известных алгоритмов. Результат такого умножения назовем псевдопроизведением (). Обозначим вес знакового разряда сомножителей (). Тогда, в соответствии с рассмотренным ранее правилом формирования дополнительного кода, отрицательные сомножители будут представлены в ДК следующим образом:

. (4.37)

При удалении знакового разряда получаем псевдомодули:

. (4.38)

Всего возможны четыре варианта сочетания знаков сомножителей:

. (4.39)

В этом случае сразу получено истинное значение положительного произведения в ДК, которое не требует корректирования.

Случай №2. .

(4.40)

Результат значительно отличается от модуля кода истинного произведения:

;

. (4.41)

Сомножитель представляет собой (s-1)-разрядный псевдомодуль числа (-X), представленного в ДК. Сомножитель эквивалентен сдвигу на (s-1) разряд влево. Сравнение (Z) и (Z’) показывает, что результат умножения должен быть скорректирован посредством сложения (Z’) с поправкой ().

Случай №3. .

. (4.42)

. (4.43)

Случай №4. .

. (4.44)

На практике используют упрощенную поправку , поскольку нескорректированный операнд (C) проявит себя в виде (1) в знаковом разряде. Это не имеет значения, поскольку знак (Z) был сформирован отдельно на начальном этапе. Подход к формированию алгоритма умножения состоит в следующем.

1. Получим псевдомодули операндов, отбросив старшие (знаковые) цифры: (0) - в положительном числе, (1) - в отрицательном.

2. Считая разрядную сетку наращиваемой, видим, что операнд в старших разрядах содержит незначащие цифры, тождественно равные знаковой.

3. В таком случае истинные операнды можем считать «удлиненными псевдомодулями», у которых самые левые цифры играют роль знаковых разрядов.

4. Выполняя их умножение по правилам, рассмотренным выше, получаем уже не модуль (Z’), а само псевдопроизведение с некоторыми псевдознаковыми цифрами в двух самых старших разрядах. Указанные цифры относятся к знаковым по расположению, но не имеют смысла таковых.

5. Возникает задача найти истинное значение знаковой цифры числа (Z).

Рассмотрим арифметическое обоснование алгоритмов второй группы при различных вариантах комбинаций знаков операндов, т.е. умножение чисел в ДК с обработкой знаковых разрядов вместе с числовыми в зависимости от сочетания знаков сомножителей. При этом используем предпосылки, приведенные в предыдущем доказательстве. Считаем, что вес знакового разряда равен (A). Тогда вес разряда, следующего за знаковым: .

Случай №1. .

Перемножая машинные представления сомножителей в ДК, получим:

. (4.45)

Случай №2. .

Учитывая, что разрядность произведения (и псевдопроизведения) составит (2s) - бит, вес разряда, следующего за знаковым разрядом произведения:

(4.46)

Тогда:

(4.47)

Перемножая ДК сомножителей, получим:

. (4.48)

Истинное значение произведения получается:

. (4.48)

. (4.49)

Случай №3. .

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

. (4.50)

Случай №4. .

. (4.51)

На практике используют упрощенную поправку:

. (4.52)

При умножении в ДК по любому из вариантов данной группы в процессе прибавления () к (Z’) важно соблюдать соответствие весов разрядов псевдопроизведения и корректирующей поправки (с учетом наличия псевдознака). Старший разряд корректирующей поправки сформирует знаковую цифру. Из рассмотренных ранее вариантов умножения в соответствии с алгоритмами обеих групп, следует, что для коррекции результата умножения ДК операндов необходимо в каждом случае по комбинации знаков определять величину коррекции, а затем выполнять 1-2 шага суммирования. Однако этого можно избежать, если коррекцию совмещать с процессом суммирования частичных произведений. Рассмотренные алгоритмы являются базовыми и реализуют непосредственный способ введения поправок. Более широкое применение на практике получили алгоритмы с косвенным способом введения поправок.

Случай №1. .

По примеру первой и второй групп результат является истинным произведением и корректировка не требуется. Т.е. сформированы истинные модуль и знак.

Случай №2. .

При умножении младшими разрядами вперед получится известный для этого случая модуль псевдопроизведения. Если при умножении на знаковую цифру множителя не прибавлять последнее ЧП к их сумме, а вычесть его, тем самым, (Z’) будет уменьшено на (). Кроме того, если для представления последнего ЧП воспользоваться ДК, то при его прибавлении не только будет откорректирована числовая часть произведения, но и сформируется правильный его знак. При этом, последний сдвиг ЧП должен быть арифметическим с учетом отрицательного знака ЧП.

Случай №3 .

Если сдвиг суммы ЧП вправо на (i) разрядов выполнять по правилам сдвига модифицированного ДК, а затем выполнять суммирование ЧП по правилам суммирования модифицированных ДК (с потерей переноса из знакового разряда), то будет получено правильное произведение исходных чисел в ДК, т.е. (). Т.о., коррекция не требуется.

Случай №4 .

Коррекция результата выполняется объединением двух предыдущих вариантов, т.е. при умножении на знаковый разряд множителя выполняют вычитание, а суммирование и сдвиг частичных произведений производят с использованием МДК. Таким образом при положительном множителе умножение в ДК можно выполнять по алгоритмам умножения в ПК, если только суммировать ЧП и сдвиг выполнять по правилам сложения и сдвига модифицированного ДК (перенос из ЗР будет игнорироваться). Существует еще один способ умножения знаковых чисел в ДК. Он заключается в том, что отрицательный множитель необходимо преобразовать в положительный. Это выполняется умножением на (-1) множимого и множителя. В итоге, в соответствии с выше приведенной теоремой, умножение выполняется по обычным правилам, а результат не нуждается в корректировке. Общий алгоритм умножения целых двоичных знаковых чисел, представленных в ДК заключается в следующем:

1. Исходное значение суммы ЧП принимается равным (0), (Сч.Т) присваивается значение, равное числу разрядов множителя.

2. Анализируется младшая разрядная цифра множителя. Если она равна (1), то к сумме ЧП прибавляется множимое; если (0) - прибавление не производится. Множимое при этом совмещается с суммой ЧП по старшим разрядам и представлено в исходном коде.

3. Производится арифметический сдвиг суммы ЧП вправо на (1) разряд с учетом флагов переноса (FC) и переполнения (FO). Содержимое (Сч.Т) уменьшается на (1).

4. пп.2-3 последовательно выполняются для всех цифровых разрядов множителя.

5. Если множитель — положительное число, то полученный результат является истинным произведением (Z). Если множитель - отрицательное число, то к полученному результату (Z’) прибавляется множимое с обратным знаком (дополнение), совмещенное по старшим разрядам. Полученная сумма представляет собой истинное произведение (Z). . Рассмотрим примеры вышеописанного алгоритма.

Пример №1. Необходимо перемножить два знаковых числа:

((+7)∙(+3) = (+21)). Для удобства возьмем длину разрядной сетки равную четырем битам, а именно: Х = (+7) – множимое, Y = (+3) – множитель, Z = (+21) – произведение. Если (X) и (Y) равняется четырем битам, то как было отмечено выше (Z) должно быть восьмиразрядным значением, т.е длина разрядной сетки произведения в два раза больше множимого и множителя. Алгоритм умножения приведен в табл. 4.6.

Таблица 4.6 - Алгоритм умножения со сдвигом вправо двоичных знаковых чисел

Регистр (В) множимое X Регистр (С) множитель Y Регистр (А) произведение Z Счетчик тактов (Сч.Т) Комментарии
                     
        множимое
        1Я СЧП
              1ЫЙсдвиг СЧП
        множимое
        2Я СЧП
              2 ОЙсдвиг СЧП
              3 ИЙсдвиг СЧП
              4ЫЙсдвиг СЧП и получили число – (+21)
    СТОП    
                     

Пример №2. Необходимо перемножить два знаковых числа:

((+7)∙(-3) = (-21)).

Для удобства возьмем длину разрядной сетки равную четырем битам, а именно:

Х = (+7) – множимое;

Y = (-3) – множитель;

Z = (-21) – произведение.

Если (X) и (Y) равняется четырем битам, то как было отмечено выше (Z) должно быть восьмиразрядным значением.

То есть длина разрядной сетки произведения в два раза больше множимого и множителя.

Алгоритм умножения приведен в табл. 4.7.

Таблица 4.7 - Алгоритм умножения со сдвигом вправо двоичных знаковых чисел

Регистр (В) множимое X Регистр (С) множитель Y Регистр (А) произведение Z Счетчик тактов (Сч.Т) Комментарии
                     
        множимое
        1Я СЧП
              1ЫЙсдвиг СЧП
              2 ОЙсдвиг СЧП
        множимое
        2Я СЧП
              3 ИЙсдвиг СЧП
        множимое
        3Я СЧП
        4ЫЙсдвиг СЧП и (получили (Z))
        кор-ция на (ХД)
        число (-21)
    СТОП    
                     

Пример №3. Необходимо перемножить два знаковых числа:

((-7)∙(+3) = (-21)).

Для удобства возьмем длину разрядной сетки равную четырем битам, а именно:

Х = (-7) – множимое;

Y = (+3) – множитель;

Z = (-21) – произведение.

Если (X) и (Y) равняется четырем битам, то как было отмечено выше (Z) должно быть восьмиразрядным значением.

То есть длина разрядной сетки произведения в два раза больше множимого и множителя.

Алгоритм умножения приведен в табл. 4.8.

Таблица 4.8 - Алгоритм умножения со сдвигом вправо двоичных знаковых чисел

Регистр (В) множимое X Регистр (С) множитель Y Регистр (А) произведение Z Счетчик тактов (Сч.Т) Комментарии
                     
        множимое
        1Я СЧП
              1ЫЙсдвиг СЧП
        множимое
        2Я СЧП
              2 ОЙсдвиг СЧП
              3 ИЙсдвиг СЧП
        4ЫЙсдвиг СЧП и (получили (Z))
        кор-ция на (YД)
        число (-21)
    СТОП    
                     

Пример №4. Необходимо перемножить два знаковых числа:

((-7)∙(-3) = (+21)).

Для удобства возьмем длину разрядной сетки равную четырем битам, а именно:

Х = (-7) – множимое;

Y = (-3) – множитель;

Z = (+21) – произведение.

Если (X) и (Y) равняется четырем битам, то как было отмечено выше (Z) должно быть восьмиразрядным значением.

То есть длина разрядной сетки произведения в два раза больше множимого и множителя. Алгоритм умножения приведен в табл. 4.9.

Таблица 4.9 - Алгоритм умножения со сдвигом вправо двоичных знаковых чисел

Регистр (В) множимое X Регистр (С) множитель Y Регистр (А) произведение Z Счетчик тактов (Сч.Т) Комментарии
                     
        множимое
        1Я СЧП
              1ЫЙсдвиг СЧП
              2 ОЙсдвиг СЧП
        множимое
        2Я СЧП
              3 ИЙсдвиг СЧП
        множимое
        3Я СЧП
        4ЫЙсдвиг СЧП и (получили (Z))
        кор-ция на (XД)
         
        кор-ция на (YД)
        число (+21)
    СТОП    
                     

4.7 Деление двоичных знаковых чисел в компьютерных системах

Так как данные в памяти компьютера хранятся в ДК, операцию деления целесообразно выполнять в ДК.

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

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

Таким образом, при делении чисел в ДК трудности, связанные с коррекцией результата (как при умножении в дополнительном коде), практически отсутствуют.

Пусть:

- разрядность (2s), - .

- разрядность (s), - .

- разрядность (s), - .

- разрядность(s), - .

Для проверки на корректность операции деления используется условие:

. Таким образом, при пробном вычитании делитель должен быть сдвинут на (s-1) разряд влево. Однако чтобы обеспечить регулярность процесса деления, делитель сдвигается влево на s разрядов, а перед пробным вычитанием делимое сдвигается на один разряд влево.

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

Алгоритм деления знаковых чисел отличается от алгоритма деления беззнаковых чисел способом формирования разрядных цифр частного.

Очередная цифра определяется на основе анализа знаков частичного остатка и делителя. Если знак полученного остатка совпадает со знаком делителя, то цифра частного равна (1), если нет – (0). При этом частное формируется в прямом или обратном коде (в зависимости от соотношения знаков делимого и делителя). На этапе пробного вычитания автоматически формируется старшая цифра частного, которая представляет его знак. Если знак полученного частичного остатка совпадает со знаком делителя, участвующего в операции пробного вычитания, деление является корректным. В противном случае имеет место переполнение разрядной сетки компьютерной системы.

Алгоритм деления целых двоичных знаковых чисел заключается в следующем:

1. Частному присваивается значение (0); (Сч.Т) – (s). Исходное значение частичного остатка равно (s) старшим разрядам делимого.

2. Частичный остаток удваивается сдвигом влево на (1) разряд, с занесением в младший разряд очередной цифры делимого.

3. Если частичный остаток и делитель разного знака, то они складываются, если же одного знака, то из частичного остатка вычитается делитель.

4. Частное сдвигается влево на (1) разряд. В освобождающийся младший разряд заносится очередн


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: