Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsia1 (1).doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
6.64 Mб
Скачать

Арифметические операции над двоичными числами с фиксированной за­пятой

Сначала рассмотрим правильные дроби. При такой форме представления неза­висимо от величин чисел их коды (операнды), над которыми производятся арифмети­ческие действия, обычно имеют одинаковое количество разрядов (длину). Для увели­чения точности вычислений в машинах может предусматриваться возможность вычис­лений, например, с двойной разрядностью. В этих случаях либо арифметические уст­ройства рассчитываются на непосредственное оперирование с операндами двойной длины, либо вычисления с повышенной точностью организуются программно. Сначала складываются младшие разряды чисел удвоенной разрядности, а затем старшие. При выполнении операций сложения и вычитания по командам СЛОЖИТЬ и ВЫЧЕСТЬ операнды из запоминающего устройства посылаются в арифметическое устройство. Чтобы свести процесс выполнения команды ВЫЧЕСТЬ к алгебраическому сложению, знак кода вычитаемого, поступающего в арифметическое устройство, искусственно меняется на обратный. Это изменение может выполняться путем суммирования по mod 2 кода знака с единицей, специально вырабатываемой схемой управления по команде ВЫЧЕСТЬ. В результате получается 01=1или 11=01.

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

  • при использовании дополнительного кода единица переноса из знакового разряда не учитывается;

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

Рассмотрим пример сложения чисел и (в десятич­ной системе счисления ) с использованием обратного и дополнитель­ного кодов. Тогда

0*.

1

0

0

1

1

0

+

1*.

1

1

0

0

0

1

1

0*.

0

1

0

1

1

1

0*.

0

1

1

0

0

0.

и . В данном примере происходит циклический перенос в млад­ший разряд, т.е. единица переноса из знакового разряда суммируется с младшим раз­рядом. Так как , то итоговый результат получен в прямом коде, подсчет дает, что Аналогично получим, что равно

0*.

1

0

0

1

1

0

+

1*.

1

1

0

0

1

0

1

0*.

0

1

1

0

0

0.

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

Пусть и (в десятичной систе счисления ). Тогда В дан­ном примере и

0*.

1

1

0

1

1

0

+

1*.

0

0

0

1

0

0

1*.

1

1

1

0

1

0,

то есть (о чем свидетельствует отсутствие переноса из знакового разряда). Аналогично получим, что

0*.

1

1

0

1

1

0

+

1*.

0

0

0

1

0

1

1*.

1

1

1

0

1

1,

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

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

Вычислим сначала .

0*.

1

0

1

0

+

1*

1

0

0

0

1

0*

0

0

1

0

0*

0

1

1

1.

Далее найдем

0*

1

0

1

0

+

1*

1

0

0

1

1

0*

0

1

1

1.

В обоих случаях мы получили результат в прямом коде (действительно, 10-7=3).

Рассмотрим разность чисел . В этом случае коды числ равны

и . равно

0*

0

1

1

1

+

1*

0

1

0

1

1*

1

1

0

0.

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

0*

0

1

1

1

+

1*

0

1

1

0

1*

1

1

0

1

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

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

Теперь рассмотрим выполнение операции умножения. Если в ОЗУ числа хра­нятся в прямом коде, то при выполнении операции умножения цифровая часть произ­ведения обычно получается как результат перемножения (деления) абсолютных вели­чин сомножителей, представленных в этом же коде. Знак произведения (частного) оп­ределяется путем суммирования по модулю два в специальном одноразрядном сумма­торе значений знаковых разрядов сомножителей. Так как при суммировании по мо­дулю два единица переноса теряется, то в результате получается 0  0 = 0, 0  1= 1  0 =1, 1  1= 0. В конце операции умножения знак результата заносится в знаковый раз­ряд сумматора или регистра, где находится цифровая часть полученного произведения. Процесс перемножения цифровых частей сомножителей сводится к последовательно­сти операций суммирования и сдвига. Если очередной разряд множителя равен 1, то соответствующее частное произведение прибавляется к содержимому сумматора, где накапливаются частные произведения. Если очередной разряд множителя равен нулю, то и очередное частное произведение равно нулю, то суммирование не производится. При анализе следующего разряда множителя происходит соответствующий сдвиг на один разряд множимого или суммы частных произведений. Умножение может произ­водиться со сдвигами множимого или сумм частных произведений как влево, так и вправо. Сдвиги влево происходят в случае, если умножение осуществляется начиная с младшего разряда множителя, вправо — со старшего разряда множителя.Эта последо­вательность действий повторяется до тех пор, пока не будут проанализированы все разряды множителя.

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

Пусть Тогда

Разряды числа

Множитель

Содержимое сумматора перед началом

0*.0000

+

0*.0110

1

Первая сумма частных произведений 1

=

0*.0110

Сдвиг на один 1 разряд вправо

0*.0011

0

+

0*.0110

1

Вторая сумма частных произведений 2

=

0*.1001

Сдвиг на один 2 разряд вправо

0*.0100

10

Сдвиг на один 2 разряд вправо

0*.0010

010

0

+

0*.0110

1

Третья сумма частных произведений 3

=

0*.1000

Сдвиг на один 3 разряд вправо

0*.0100

0010

Результат

=

0*.0100

0010

Знак произведения 0 1=1

Окончательный результат

1*.0100

0010

Окончательный результат Проверим правильность вычисле­ний. . В двоичной системе .

Далее рассмотрим умножение целых чисел. Пусть

Множитель

Содержимое сумматора перед началом

0*0000

0000

+

0*0101

0000

1

Первая сумма частных произведений 1

=

0*0101

0000

Сдвиг 1 на один разряд вправо

0*0010

1000

Сдвиг 1 на один разряд вправо

0*0001

0100

0

+

0*0101

0000

Вторая сумма частных произведений 2

=

0*0110

0100

1

Сдвиг 2 на один разряд вправо

0*0011

0010

+

0*0101

0000

1

Третья сумма частных произведений 3

=

0*1000

0010

Сдвиг 3 на один разряд вправо

0*0100

0001

Знак произведения 0 0=0

Окончательный результат

0*0100

0001

Таким образом, ( , перевод 65 в двоичную систему счисле­ния дает результат ).

Следует заметить, что данная схема умножения двоичных чисел не является единственной. Для ускорения процессов умножения широко используются схемы, в которых производится умножение одновременно на несколько разрядов множителя (на 2, 4, 6).

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

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

Разряды частного

Делимое

0*.110

Делитель Bдоп

+

1*.001

Остаток R1<0

=

1*.111

0.

Восстановление остатка

+

0*.111

=

10*.110

Сдвиг R1

1*.100

Делитель Bдоп.

+

1*.001

Остаток R2>0

=

10*.101

1

Сдвиг R2

1*.010

Делитель Bдоп.

+

1*.001

Остаток R3>0

=

10*.011

1

Сдвиг R3

0*.110

Делитель Bдоп.

+

1*.001

Остаток R4<0

=

1*.111

0

Восстановление остатка

+

0*.111

=

10*.110

Сдвиг R4

1*.100

Делитель Bдоп.

+

1*001

Остаток R5>0

=

10*.101

1

Сдвиг R5

1*.010

Делитель Bдоп.

+

1*.001

Остаток R6>0, доп. разряд

=

10*.011

1

Знак частного 1 0=1

Окончательный результат

1*11011

Итак . Проверка в десятичной системе счисления дает следую­щий результат : , что соответствует двоичному числу .

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

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

Разряды частного

Делимое

0*.110

Делитель Bдоп.

+

1*.001

Остаток R1<0

=

1*.111

0.

Сдвиг R1

1*.110

Делитель Bпр.

+

0*.111

Остаток R2>0

=

10*.101

1

Сдвиг R2

1*.010

Делитель Bдоп.

+

1*.001

Остаток R3>0

=

10*.011

1

Сдвиг R3

0*.110

Делитель Bдоп.

+

1*.001

Остаток R4<0

=

1*.111

0

Сдвиг R4

1*.110

Делитель Bпр.

+

0*.111

Остаток R5>0

=

10*.101

1

Сдвиг R5

1*.010

Делитель Bдоп.

+

1*.001

Остаток R6>0, доп. разряд

=

10.*011

1

Знак частного 1 0=1

Окончательный результат

1*.11011

Очевидно, что для исключения переполнения делитель должен быть больше де­лимого, так как в противном случае возникает переполнение, то есть в результате вы­читания делителя из делимого получится положительный остаток, и, следовательно, разряд целой части частного будет равен единице. При делении правильных дробей частное анализируется на переполнение и вырабатывается соответствующий признак результата ПР. Признак ПР=11 вырабатывается, когда первый остаток положитель­ный, т.е. делитель меньше делимого. Могут также вырабатываться специальные при­знаки результата по отношению к нулю. В машинах обычно реализуется деление без восстановления остатка, не требующее лишних действий, связанных с восстановле­нием остатков и, следовательно, удлиняющих процесс деления.

Для обеспечения возможности округления в компьютерах часто вычисляется значение дополнительного разряда частного путем выполнения дополнительного шага деления. Округление выполняется путем прибавления единицы к значению дополни­тельного разряда. Для последнего примера округленное частное равно 11*.11011+1=11*.11100, т.е.

При выполнении арифметических действий над целыми двоичными числами эти числа выравниваются по младшим разрядам, правее которых фиксируется десятичная запятая (точка). В арифметическом устройстве операции выполняются над операн­дами, имеющими одинаковую длину. Однако в ЗУ длина их может быть разной. Обычно в компьютерах устанавливаются несколько возможных для использования длин, соответственно имеющие 16, 32 и 64 двоичных разряда. Длины операндов, над которыми должны быть произведены действия, указываются в командах программы. Крайний левый разряд (нулевая позиция) операнда любой длины отводится для пред­ставления знака. За исключением выравнивания по правой границе операндов сложе­ние и вычитание в арифметическом устройстве целых двоичных чисел выполняются аналогично действиям над правильными дробями. Если, например, в ЗУ отрицатель­ные числа хранятся в дополнительном коде, то, когда требуется выполнить сложение, они просто складываются. Операнды, соответствующие положительным целым двоич­ным числам, занимающим только часть разрядов (младших) слова, имеют во всех раз­рядах левее старшей значащей цифры нули, а соответствующие отрицательным — единицы. Поэтому увеличение длин операндов в сторону старших разрядов осуществ­ляется простым добавлением разрядов, содержащих согласно знаку, нули при положи­тельном и единицы при отрицательном числах. Переполнение можно обнаружить при­менением в арифметическом устройстве модифицированных кодов или при анализе переносов в знаковый разряд и из знакового разряда. Из арифметических действий над целыми числами большими особенностями обладают операции умножения и деления. Произведение двух - разрядных двоичных чисел имеет не более разрядов. Это обстоятельство необходимо учитывать при перемножении целых чисел. На машинный код результата операции умножения должно отводиться удвоенное количество разря­дов. В этом случае при умножении никогда не произойдет переполнения. Процесс соб­ственно перемножения целых двоичных чисел может строиться по различным схемам, некоторые были рассмотрены в примерах. В обоих случаях перемножаются полностью -разрядные операнды независимо от того, сколько разрядов в них занимают целые числа. При делении целых чисел, наоборот, один из операндов, а именно делимое, имеет удвоенное количество разрядов по отношению к делителю и частному. Так же как и умножение, собственно деление реализуется аналогично рассмотренному выше. Важно лишь правильно начать вычитание делителя из старших разрядов делимого. Для этого вначале делают пробные шаги, чтобы правильно расположить делимое и дели­тель. Критерием правильности расположения может быть получение первого отрица­тельного остатка.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]