Но с отрицательными числами в дополнительном коде такая схема не дает правильного результата. Преобразование дополнительного кода при расширении разрядной сетки выполняется следующим образом: нужно скопировать значение знакового разряда во все дополнительные биты. Если исходное число было положительным, то все дополнительные биты заполнятся нулями, а если отрицательным — единицами Эта операция называется расширением знака. Формально справедливость этого правила доказывается следующим образом. Рассмотрим n-разрядную последовательность двоичных цифр, которая интерпретируется как представление в дополнительном коде числа А.
Представление с фиксированной точкой
И наконец, следует остановиться еще на одном нюансе. Описанные выше форматы объединяются часто одним термином — формат с фиксированной т кой. Суть его в том, что положение разделительной точки между целой и дробной частями числа неявно фиксируется на разрядной сетке. В настоящее время принято фиксировать точку справа от самого младшего значащего разряда. Программист может использовать аналогичное представление для работы с двричными дробными числами, мысленно фиксируя точку перед старшим значат, разрядом и соответственно масштабируя результаты преобразований, выполняемых стандартными программными или аппаратными средствами.
Арифметические операции с целыми числами
Отрицание
Операция отрицания числа, представленного в прямом коде, выполняется очень просто — нужно инвертировать значение знакового разряда. Если же число представлено в дополнительном коде, отрицание выполняется несколько сложнее, Правило выполнения этой операции формулируется следующим образом. Следует инвертировать значение в каждом разряде представления исходного числа (положительного или отрицательного), включая и знаковый, т.е, установить значение 1 в тех разрядах, где ранее было значение 0, и значение 0 — в тех разрядах, где ранее было значение 1 (эту операцию иногда называют поразрядным дополнением — bitwisecomplement, а ее результат — инверсным кодом).
Нужно сложить образовавшееся число с числом 0, . .001 по правилам сложения чисел без знака. Иногда эту операцию называют вычислением дополнения числа в дополнительном коде (twoscomplementoperation).
После операции поразрядного дополнения получим инверсный код интерпретируя его как число без знака, добавим число 1. Полученныйрезультат вновь интерпретируем как число В в дополнительном коде.
Соотношение А = -В эквивалентно соотношению А+В=0.
Сложение и вычитание в дополнительном коде
При выполнении сложения чисел с одинаковыми знаками результат может оказаться таким, что не вмешается в используемую разрядную сетку, т.е. получается число, которое выходит за диапазон представления. Появление такого результата расценивается как переполнение (overflow), и на схему АЛУ возлагается функция выявить переполнение и выработать сигнал, который должен воспрепятствовать использованию в дальнейшем полученного ошибочного результата. Для вычитания одного числа (вычитаемого) из другого (уменьшаемого) необходимо предварительно выполнить операцию отрицания над вычитаемым, а затем сложить результат с уменьшаемым по правилам сложения в дополнительном коде.
В приложении, рисунок 2, представлена блок-схема узлов АЛУ, принимающих участие в выполнении операций сложения и вычитания целых чисел. Центральным узлом является двоичный сумматор, на входы которого подаются коды слагаемых, а на выходах формируется двоичный код суммы, причем операция выполняется по правилам сложения чисел без знака. При выполнении сложения оба слагаемых направляются на входы сумматора непосредственно из регистров слагаемых. Результат передается либо в один из регистров слагаемых, либо в третий регистр результата. Кроме кода результата тип сумматор формирует сигнал переполнения, который фиксируется в 1-битовом флаге переполнения. Значение флага интерпретируется следующим образом: 0 — переполнение отсутствует, 1 — есть переполнение. При выполнении операции вычитания код вычитаемого, хранящийся перед началомоперации в регистре, передается на схему, выполняющую операцию отрицания, а уже с выхода этой схемы код поступает на вход сумматора.
Умножение
Алгоритмы выполнения умножения значительно сложнее, чем сложения и вычитания, причем в современных вычислительных системах можно встретить как аппаратную его реализацию, так и программную. Существует много вариантов этих алгоритмов, причем многие из них имеют не только теоретический, но и практический интерес, и выбор одного из многих может быть произведен только с учетом специфики применения конкретной системы.
Начнем с простой задачи перемножения двух чисел без знака (т.е. неотрицательных чисел), а затем рассмотрим один из наиболее широко известных алгоритмов умножения целых чисел со знаком, представленных в двоичном коде.
Умножения чисел без знака
1. При выполнении умножения необходимо формировать частичные произведения, по одному на каждый разряд множителя. Эти частичные произведения затем суммируются, а их сумма и есть результат умножения — полное произведение.
2. Сформировать частичные произведения в двоичном коде довольно легко. Если соответствующий разряд множителя равен 0, частичное произведение также равно 00..00. Если соответствующий разряд множителя равен 1 . частичное произведение равно множимому.
3. Полное произведение вычисляется суммированием частичных произведений, причем каждое очередное частичное произведение в этой сумме сдвигается на одну позицию влево относительно предыдущего.
4. Результатом перемножения двух n-разрядных целых чисел будет 2n-разрядное число.
Во-первых, суммирование очередного частичного произведения можно выполнять немедленно после того, как оно будет сформировано, не дожидаясь остальных. Во-вторых, можно сформировать частичные произведения. Для разряда в коде множителя, равного 1, нужно выполнить сдвиг и сложение кода множимого, а для разряда, равного 0, — только сдвиг.
Умножение чисел в дополнительном коде
Мы уже отмечали, что при выполнении сложения и вычитания чисел в дополнительном коде они интерпретируются как числа без знака. Схема оказывается неработоспособной при выполнении умножения. Она неприменима, если оба сомножителя отрицательны. Она неправильного результата в случае, если отрицателен хотя бы один из сомножителей.
Единственное отличие в том, что частичные произведения трактуются как 2n-разрядные числа, сформированные из n-разрядного множимого. Рассматривая 4-разрядное множимое как число без знака, получим после расширения до восьми разрядов. Любое частичное произведение, соответствующее умножению этого числа на некоторый разряд множителя, отличный от 0-го, формируется сдвигом расширенного кода множимого влево на соответствующее число разрядов, причем освободившиеся справа разряды, заполняются кодом 0. Каждое частичное - введение, образованное от отрицательного множимого, при его формировании знаковый разряд исходного числа должен быть расширен. Разряды отрицательного множителя в дополнительном коде не соответствуют частичным произведениям, сформированным сдвигом множимого. Для суммирования частичных произведений нельзя использоватьзначения разрядов кода множителя
Решить эту дилемму можно по-разному. Один из способов - преобразовать оба сомножителя в положительные числа, перемножить их по правилам умножения чисел без знака, а затем, если знаки сомножителей были разными, выполнить операцию отрицания результата по правилам, принятым для чисел в дополнительном коде. Конструкторы АЛУ предпочитают способ, который не требует выполнения дополнительного преобразования после завершения умножения: алгоритм Бута (Booth). Схема алгоритма Бута приведена в приложении (рисунок 3). Сомножители размещаются в регистрах. Кроме них имеется одноразрядный регистр, который связан с младшим разрядом регистра. Если оба разряда имеют одинаковые значения, все разряды регистров сдвигаются на 1 разряд вправо. Такую операцию принято называть сдвигом с сохранением знака или арифметическим сдвигом. Следовательно, произведение на такой множитель можно получить с помощью всего одной операции сложения и одной операции вычитания.
Представление чисел в формате с плавающей точкой
В формате с фиксированной точкой, в частности в дополнительном коде, можно представлять положительные и отрицательные числа в диапазоне, симметричном на числовой оси относительно точки 0. Расположив воображаемую разделяющую точку в середине разрядной сетки, можно в этом формате представлять не только целые, но и смешанные числа, а также дроби.
Однако такой подход позволяет представить на ограниченной разрядной сетке множество вещественных чисел в довольно узком диапазоне. Нельзя представить очень большие числа или очень маленькие. При выполнении деления больших чисел, как правило, теряется дробная часть частного.
При работе в десятичной системе счисления ученые давно нашли выход из положения, применяя для представления числовых величин так называемую научную нотацию.
Этот же подход можно применить и в двоичной системе счисления. Компоненты можно сохранить в двоичном слове, состоящем из трех полей:
• поле знака числа (плюс или минус);
• поле мантиссы;