Арифметические операции над двоичными числами
Рассматривая реализацию в ЭВМ различных арифметических операций, необходимо учитывать особенности их выполнения для различных форм представления чисел (с фиксированной или плавающей точкой).
Операция алгебраического сложения чисел, представленных в форме с фиксированной точкой, сводится, как уже отмечалось, к арифметическому суммированию с использованием дополнительного кода для отрицательных чисел. Знаковые разряды чисел участвуют в сложении так же, как и значащие. При этом слагаемые должны иметь одинаковое число значащих разрядов. Для выравнивания разрядности слагаемых можно дописать незначащие нули в старшие разряды меньшего по модулю числа.
Если в результате сложения получилась положительная сумма (0 в знаковом разряде), то она представлена в прямом коде. Если в знаковом разряде образовалась единица, то сумма отрицательна и представлена в дополнительном коде.
Пусть, например, требуется сложить целые числа х = - 610 = - 1102 и у = + 310 = + 0112. В соответствующих кодах эти числа представятся следующим образом: xпр = 1.110; xобр = 1.001; xдоп = 1.010; упр = 0.011.
При суммировании xдоп и упр
получен отрицательный результат, следовательно (х + у)доп = 1.101. Переведя этот результат в десятичную систему счисления (1.101)доп > (1.100)обр > (1.011)пр = - 011.1 = - 310, убеждаемся в правильности выполненной операции.
При сложении кодов может возникнуть так называемое переполнение разрядной сетки, при котором результат превышает предельно допустимое положительное или отрицательное значение. Признаком переполнения является наличие переноса в знаковый разряд суммы при отсутствии переноса из знакового разряда (положительное переполнение) или наличие переноса из знакового разряда суммы при отсутствии переноса в ее знаковый разряд (отрицательное переполнение). При положительном переполнении результат операции положительный, а при отрицательном - отрицательный.
Если же переносов из знакового разряда и в знаковый разряд суммы нет или есть оба эти переноса, то переполнения нет и при нуле в знаковом разряде сумма положительна и представлена в прямом коде, а при единице в знаковом разряде сумма отрицательна и представлена в дополнительном коде.
100
Операция алгебраического сложения чисел, представленных в форме с плавающей точкой, производится несколько сложнее. При ее выполнении сначала выравниваются порядки слагаемых. В результате сравнения порядков порядок меньшего по модулю числа принимается равным порядку большего, а его мантисса сдвигается вправо на число разрядов, равное разности порядков.
В процессе сдвига мантиссы меньшего слагаемого происходит потеря младших разрядов, что вносит определенную погрешность в результат выполнения данной операции. При этом может даже оказаться, что мантисса меньшего слагаемого сдвигается за пределы разрядной сетки. Тогда в качестве результата суммирования принимается большее по модулю слагаемое.
После выравнивания порядков производится алгебраическое сложение мантисс по известным правилам (как и для чисел с фиксированной точкой). Порядок результата принимается равным порядку большего слагаемого. В процессе суммирования может нарушиться нормализация результирующей мантиссы. В этом случае производится сдвиг мантиссы с соответствующим изменением порядка результата.
Умножение двоичных чисел является многотактной операцией. Количество таких тактов соответствует разрядности сомножителей. В каждом такте производится умножение множимого на очередной разряд множителя. Образующиеся при этом частичные произведения затем со сдвигами суммируются. Операция умножения двоичных чисел, по существу, сводится к многократному выполнению операций суммирования и сдвига подобно тому, как это делается в десятичной системе счисления. Однако здесь значительно проще по сравнению с десятичной системой образуются частичные произведения. Они либо повторяют множимое, если в соответствующем разряде множителя единица, либо равны 0, если содержится 0 в соответствующем разряде множителя.
Умножение чисел, представленных в форме с фиксированной точкой, рассмотрим на примере перемножения модулей целых чисел: множимого х = 710 = 1112 и множителя у = 510 = 1012. Произведение как результирующая сумма ? частичных произведений будет сформировано за 3 такта.
Его разрядность станет удвоенной по сравнению с разрядностью множителей.
101
В итоге получен необходимый результат: х · у = 1000112 = 1 · 2 + 0 · 24 + 0 · 23 + 0 · 22 + 1 · 21 + 1 · 20 = 32 + 2 + 1 = 3510.
Умножение чисел со знаками можно свести к перемножению их модулей с последующим формированием знакового разряда произведения путем сложения по модулю 2 (без учета переноса) знаковых разрядов множителей: 0 + 0 = 0; 0 + 1 = 1; 1 + 0 = 1; 1 + 1 = 0 (перенос игнорируется).
Операция умножения для чисел, представленных в форме с плавающей точкой, протекает аналогично, с той лишь разницей, что при этом добавляется операция определения порядка произведения алгебраическим сложением порядков множителей и проводится, если необходимо, нормализация результирующей мантиссы с соответствующим изменением порядка произведения.
Если при суммировании порядков возникло переполнение и порядок произведения получился отрицательный, то это означает, что искомое произведение меньше минимально представляемого в ЭВМ числа, и тогда в качестве результата операции может быть записан нуль без перемножения мантисс. Если же возникло переполнение для положительного порядка, то результат при этом может все - таки находиться в диапазоне чисел, представляемых в ЭВМ. Это объясняется тем, что при умножении мантисс происходит нарушение нормапизации вправо, поэтому после нормализации мантиссы переполнение в порядке произведения исчезает.
Операция деления чисел, как и умножение, является многотактной и сводится к выполнению многократных вычитаний и сдвигов. При этом разряды частного определяются (начиная со старшего) последовательным вычитанием делителя сначала из делимого, а затем из образующихся в процессе деления сдвигаемых остатков Если разность между делимым (или очередным остатком) и делителем положительна или равна нулю, то в соответствующий разряд частного заносится 1, а если отрицательна - заносится 0.
Поскольку в ЭВМ операция вычитания в непосредственном виде не выполняется, последовательное вычитание заменяют сложением остатков с дополнительным кодом отрицательного делителя.
При этом новый остаток получается также в соответствующем коде.
Деление в ЭВМ может быть реализовано двумя методами: с восстановлением остатка и без восстановления остатка.
Метод деления с восстановлением остатка состоит в том, что при получении отрицательного остатка в данном разряде частного записывается нуль, и восстанавливается предыдущий положительный остаток прибавлением к полученному отрицательному остатку делителя в прямом коде. Восстановленный остаток после этого сдвигается дополнительно на один разряд влево, и по отношению к нему выполняется изложенная выше последовательность действий.
Метод деления без восстановления остатка состоит в том, что при получении отрицательного остатка в соответствующий разряд частного записывается
102
нуль, а затем этот остаток сдвигается влево на один разряд и к нему прибавляется делитель в прямом коде. В результате получается следующий остаток, у которого анализируется знак и в зависимости от этого выполняются следующие действия.
Рассмотрим на конкретном примере процесс деления целых чисел, представленных в форме с фиксированной точкой. Делимое в этой форме обычно представляется удвоенным количеством разрядов по сравнению с делителем и частным.
Пусть в качестве делимого и делителя заданы, соответственно, числа х = + 35 и у = + 7. Представим эти числа в соответствующих машинных кодах: хпр = 0.100011; упр = 0.111; удоп = 1.001. Для деления данных чисел воспользуемся методом с восстановлением остатка. Вычитание делителя из очередного остатка заменим сложением в дополнительном коде.
103
Как видим, результат получился правильный: х/у = 1012 = 510. Метод деления без восстановления остатка получил более широкое распространение, так как здесь сразу же получается следующий, подлежащий анализу остаток без восстановления предыдущего. Для этого полученный отрицательный остаток сдвигается на один разряд влево и к нему прибавляется делитель в прямом коде. Убедимся в этом на предыдущем примере, для которого первый остаток получился отрицательный: 1101.
Сдвинув его на один разряд влево и прибавив делитель, получим сразу же следующий второй положительный остаток:
Операция деления чисел, представленных в форме с плавающей точкой, выполняется путем деления мантиссы делимого на мантиссу делителя; при этом порядок частного определяется разностью порядков делимого и делителя. Полученное частное нормализуется, и ему присваивается знак плюс, если делимое и делитель имеют одинаковые знаки, и знак минус, если их знаки разные. Деление мантисс выполняется аналогично делению целых чисел с фиксированной точкой. Отличие состоит только в том, что делимое берется такой же разрядности, как и делитель. При этом полагается, что в младшей половине разрядов делимого содержатся нули. После сдвига влево очередного остатка освобождающийся разряд заполняется нулем и деление выполняется точно так же, как и для целых чисел.
Таким образом, независимо от формы представления чисел операции умножения - деления являются более сложными для выполнения, чем операции сложения - вычитания. Например, для n - разрядных чисел время выполнения умножения превышает примерно в n раз время сложения. По этой причине операции умножения - деления обычно называют длинными операциями по сравнению с короткими операциями сложения - вычитания. В современных ЭВМ обычно применяют различные аппаратурные и логические методы для ускоренного выполнения операций умножения - деления.
104
100 :: 101 :: 102 :: 103 :: 104 :: Содержание