В компьютерах с целью упрощения арифметических операций применяют специальные коды для представления чисел. При помощи этих кодов упрощается определение знака результата операции, операция вычитания (или алгебраического сложения) чисел сводится к арифметическому сложению их кодов, облегчается выработка признаков переполнения разрядной сетки. В результате упрощаются устройства компьютеров, выполняющие арифметические операции.
Для представления отрицательных чисел в компьютерах применяют прямой, обратный и дополнительный коды. Положительные числа представляются в прямом коде. Во всех этих кодах выделяются цифровые разряды и знаковый (крайний слева), представляющий знак числа, причем знак плюс кодируется цифрой 0, а знак минус цифрой 1.
Прямой код двоичного числа G с (n-1) цифровыми разрядами определяется как
Gпр =
где А — величина, равная весу знакового разряда. Для дробных чисел А = 1, а для целых А = 2n-1.
Сложение в прямом коде чисел, имеющих одинаковые знаки, выполняется достаточно просто. Числа складываются, и сумме присваивается код знака слагаемых. Значительно более сложной является операция алгебраического сложения в прямом коде чисел с различными знаками. В этом случае приходится определять большое по модулю число, производить вычитание чисел и присваивать разности знак большего по модулю числа.
Операция вычитания (алгебраического сложения) сводится к операции простого арифметического сложения при помощи обратного и дополнительного кодов, используемых для представления отрицательных чисел в машине.
Чтобы представить двоичное отрицательное число в обратном коде, нужно поставить в знаковый разряд 1, а во всех других разрядах заменить 1 нулями, а нули единицами.
Обратный код, если рассматривать его как число, является дополнением модуля исходного числа до наибольшего числа без знака, помещающегося в разрядную сетку. Для n-разрядной сетки имеем
Go6p=2-2 –(n-1) – lG-l,
если G- — двоичная дробь, и
G-обр = 2n – 1 - |G-|
если G- — целое двоичное число.
При представлении отрицательного двоичного числа в дополнительном коде ставят 1 в разряд знака, а цифровую часть числа заменяют дополнением модуля числа до 1 или 2n-1соответственно для дробей и целых чисел. Дополнительный код отрицательного числа G определяется выражением
G-доп=2-|G-|
если G- — двоичная дробь, и
G-доп=2n-|G-|
если G- — целое двоичное число.
Обратный и дополнительный коды числа можно рассматривать как двоичные числа без знаков, при этом для двоичных дробей G-доп = G-обр + 2-(n-1), а для двоичных целых чисел С-доп=С-обр+1.
Таким образом, дополнительный код числа может быть получен из обратного путем прибавления 1 к младшему разряду обратного кода.
При выполнении расчетов на машине могут возникнуть как «положительный», так и «отрицательный» 0. Положительный 0 в прямом коде имеет вид
(+0)пр= 000... 0.
Отрицательный 0 изображается в прямом коде
( - 0)пр= 100. ..О,
в обратном
(-0)обр= 111...1;
в дополнительном коде отрицательный 0 отсутствует.
При представлении положительных чисел прямым кодом, а отрицательных дополнительным нуль имеет единственное изображение. При применении обратного кода «положительный» и «отрицательный» 0 имеют разные изображения.
Изменению знака отрицательного числа соответствует инвертирование его кода, если число представлено в обратном коде, и инвертирование и добавление 1 младшего разряда, если отрицательное число представлено в дополнительном коде. В результате получается прямой код соответствующего положительного числа. Сказанное следует из соотношений:
для дробей
-G-пр = |G-| = 2 – 2-(n-1) – G-обр
-G-пр = |G-| = 2 – G-доп
для целых чисел
-G-пр = |G-| = 2n– 1 – G-обр
-G-пр = |G-| = 2n – G-доп
Рассмотрим применение обратного и дополнительного кодов при алгебраическом сложении n-разрядных двоичных чисел G и Q, когда одно из них или оба числа отрицательны. Могут быть сформулированы следующие правила (предполагаем, что модуль алгебраической суммы меньше 1 для дробей и меньше 2n-1для целых чисел, и, следовательно, код суммы представим в n-разрядной сетке).
При алгебраическом сложении двух двоичных чисел с использованием обратного (или дополнительного) кода положительные слагаемые представляются в прямом коде, а отрицательные - в обратном (дополнительном) и производится арифметическое суммирование этих кодов, включая разряды знаков, .которые при этом рассматриваются как старшие разряды. При возникновении переноса из разряда знака единица переноса прибавляется к младшему разряду суммы кодов при использовании обратного кода и отбрасывается при использовании дополнительного кода. В результате получается алгебраическая сумма в прямом коде, если эта сумма положительна, и в обратном (дополнительном), если она отрицательна.
Пример.
Пусть требуется выполнить две операции:
176- 154 и 176- 215
В первом случае результат будет положительный, а во втором – отрицательный. Переведем эти числа в двоичный код, например, через восьмеричную систему.
176 8 154 8 215 8
176 22 8 152 19 8 208 26 8
0 16 2 2 16 2 7 24 3
6 3 2
17610=2608 15410=2328 21510=3278
0101100002 0100110102 0110101112
инвертируем вычитаемые в обратный и дополнительный коды
101100101 обр 1001010002
+ 1 + 1
101100110 доп 100101001 доп
теперь складываем уменьшаемое с дополнительными кодами обоих вычитаемых с учётом знаков
0 010110000 0 010110000
+ 1 101100110 + 1 100101001
10 000010110 1 111011001
в первой операции возникла единица переполнения, но знак результата плюс, поэтому переводим число в восьмеричную систему и далее в десятичную: 268=2·81+6·80=2210, что соответствует результату первой операции.
во второй операции знак результата отрицательный, поэтому его придется перевести в дополнительный код:
000100110 обр
+ 1
000100111 доп =478=3910
или с учётом знака -39.
Признак переполнения разрядной сетки. При алгебраическом сложении двух чисел, помещающихся в разрядную сетку, может возникнуть переполнение, т. е. образоваться сумма, требующая для своего представления на один цифровой разряд больше по сравнению с разрядной сеткой слагаемых. Можно сформулировать следующее правило (признак) для обнаружения переполнения разрядной сетки.
При алгебраическом сложении двух двоичных чисел с использованием прямого кода для представления положительных и дополнительного (обратного) кода для представления отрицательных чисел признаком переполнения является наличие переноса в знаковый разряд суммы при отсутствии переноса из ее знакового разряда (положительное переполнение) или наличие переноса из знакового разряда суммы при отсутствии переноса в ее знаковый разряд (отрицательное переполнение). Если и в знаковый, и из знакового разряда суммы есть переносы или нет этих переносов, то переполнение отсутствует. При положительном переполнении результат операции положительный, а при отрицательном отрицательный.