А = 141, В = 8.
N шага | Операнды | Действия | Комментарии | |
Делимое/остаток старш. разр. | Делимое/остаток младш. разр. | |||
А В R0≥0 | _1 0 0 0 1 0 0 0 0 0 0 0 | 1 1 0 1 | Заем отсутствует. Некорректность деления. |
Для рассматриваемых делимого и делителя С=17.
Аналогичная ситуация фиксации некорректности деления будет иметь место и при В<8, в том числе и при В=0.
Возможные модернизации метода деления
1) Для явного представления знака остатка можно использовать дополнительный старший бит как в регистре остатка, так и в сумматоре-вычитателе. Следует иметь в виду, что при сдвиге остатка влево может произойти искажение старшего бита остатка, интерпретируемого как знаковый. В связи с этим действия на очередном шаге алгоритма деления следует определять значением знакового бита остатка до сдвига, а не после.
Замечание: для устранения этого недостатка можно использовать модифицированный код с двумя битами для представления знаков. В этом случае старший знаковый бит даже после сдвига остатка влево будет сохранять верное значение знака остатка. Это замечание касается также и знакового деления целых чисел.
2) Для упрощения метода операцию вычитания делителя можно заменить операцией сложения с его дополнительным кодом.
В процессорах Intel беззнаковое деление реализуется командой DIV, а знаковое - командой IDIV.
Деление знаковых чисел
Аналогично операции умножения знаковое деление может быть реализовано одним из двух методов:
• метод деления в прямых кодах;
• метод деления в дополнительных кодах.
Основные особенности метода деления в прямых кодах
1. Отрицательные операнды предварительно преобразуются из дополнительного кода в прямой.
2. Деление модулей операндов осуществляется аналогично методу деления для беззнаковых чисел.
3. Знак частного вырабатывается отдельным действием как сумма по модулю 2 знаковых разрядов операндов.
4. Знаку остатка присваивается знак делимого. Исключением из правил 3,4 является получение нулевого частного и(или) нулевого остатка, которым, независимо от знаков операндов, присваивается знак + (положительный ноль).
5. Отрицательные результаты в конце операции преобразуются из прямого кода в дополнительный.
6. Существенным отличием знакового деления в прямых кодах от беззнакового деления является проверка корректности деления, выполняемая на начальных шагах алгоритма.
Обоснование метода проверки корректности деления
В связи с тем, что старший бит n-разрядного делителя и, соответственно, частного отводится для представления знака, условие корректности для для деления модулей операндов имеет вид:
|A| / |В| ≤ 2n-1 – 1 => |A| / |В| < 2n-1
|A| / |В| · 2n-1 < 0
Из полученного соотношения следует, что на этапе пробного вычитания следует делимое и делитель расположить друг под другом следующим образом:
|A|
|В| · 2n-1
1 бит
В целях однообразия выполнения пробного вычитания с основным циклом деления, в котором делитель размещается под старшими разрядами остатка, необходимо перед выполнением пробного вычитания сдвинуть делимое на один разряд влево и после этого произвести вычитание делителя из его старших разрядов.
Основные особенности метода деления в дополнительных кодах
1. Цифры частного, формируемые на каждом шаге, определяются не только знаком остатка, но и знаком делителя. При их совпадении цифра частного равна 1, при несовпадении – 0.
2. Действие, выполняемое над текущим остатком на каждом шаге, определяется не только знаком остатка, но и знаком делителя. При их совпадении производится вычитание делителя из старших разрядов остатка, а при несовпадении – сложение делителя со старшими разрядами остатка. Вычитание делителя может заменяться сложением с его дополнительным кодом.
3. Коррекция остатка выполняется в конце операции (после выработки всех цифр частного) в том случае, если знак последнего остатка не совпадает со знаком делимого. Эта коррекция осуществляется действием над остатком (прибавление или вычитание делителя), аналогичным действиям в основном цикле деления (определяется сравнением знаков остатка и делителя).
4. Коррекция частного выполняется только при отрицательном делимом и нулевом остатке и состоит в инкременте (увеличении на единицу) для положительного частного и декременте для отрицательного частного.
5. Проверка корректности деления реализуется аналогично методу деления в прямых кодах только в случае положительных операндов. Для остальных комбинаций знаков имеют место следующие нюансы:
Обоснование методов проверки корректности
1) А>0, B>0.
A/B < 2n-1;
A - B·2n-1 < 0.
2) А<0, B<0.
A/B < 2n-1;
A - B·2n-1 > 0.
Из полученных соотношений следует, что проверка корректности при одинаковых знаках делимого и делителя реализуется следующим образом:
а) выполняется предварительный сдвиг делимого на один разряд влево;
б) из старших разрядов сдвинутого делимого вычитается делитель;
в) знак полученного остатка сравнивается со знаком делимого. Если они совпадают, то деление некорректно, и операция завершается выходом на прерывание. Если знаки делимого и первого остатка не совпадают, то формируется старший разряд частного, интерпретируемый как знак, и осуществляется переход к основному циклу деления. Знак частного формируется по тем же правилам, что и любая его цифра, т.е. как результат сравнения знаков текущего остатка и делителя.
3) A<0, B>0.
A/B ≥ - 2n-1;
A/B ≥ - 2n-1 – 1;
A + B·2n-1 + B > 0.
4) A>0, B<0.
A/B > - 2n-1 – 1;
A + B·2n-1 + B < 0.
Из полученных соотношений следует, что проверка корректности деления при разных знаках делимого и делителя выполняется в такой последовательности:
1. сложение делителя с младшими разрядами делимого;
2. сдвиг полученного остатка влево;
3. сложение делителя со старшими разрядами остатка;
4. знак полученного остатка сравнивается со знаком делимого. Если они совпадают, то деление некорректно, и операция завершается выходом на прерывание. Если знаки делимого и первого остатка не совпадают, то формируется старший разряд частного, интерпретируемый как знак, и осуществляется переход к основному циклу деления. Знак частного формируется по тем же правилам, что и любая его цифра, т.е. как результат сравнения знаков текущего остатка и делителя.