Коды двоичных чисел
Виды кодов отрицательных чисел
В принципы работы вычислительных машин заложен принцип двоичного кодирования: все данные представлены в виде закодированных некоторым образом двоичных чисел. коды двоичных чисел необходимы для того, чтобы производить над данными логические и арифметические операции.
В статье "Системы счисления" мы рассматривали только положительные числа. При записи двоичных чисел со знаком в их формате необходимо предусмотреть два поля: поле, определяющее знак числа, и поле, характеризующее модуль числа. Под знак числа отводится специальный знаковый бит (двоичный разряд). Остальные разряды определяют модуль числа. Знаковый разряд приписывается слева от модуля числа, причём знаку "+" соответствует нулевое значение знакового бита, а знаку "-" - единичное.
В истории развития компьютеров использовались три основных варианта представления знаковых чисел:
- прямой код или знак и величина;
- обратный код или код с дополнением до единицы;
- дополнительный код или код с дополнением до двух.
Во всех трёх кодах положительные числа выглядят одинаково. Различия в форме записи отрицательных чисел в обратном и дополнительном кодах касаются только способа представления модуля числа, а способ кодирования и место расположения знакового бита остаются неизменными.
Прямой код двоичного числа
В системе представления в прямом коде число состоит из кода знака и модуля числа, причём обе эти части обрабатываются по отдельности.
Примеры прямого кода для правильных дробей:
Примеры прямого кода для целых чисел:
Представление чисел в прямом коде имеет существенный недостаток - формальное
суммирование чисел с различающимися знаками даёт неверный результат. Пример - сложение двух чисел
и
.
В прямом коде эти числа имеют вид:
и
.
Очевидно, что результат должен быть равен -2, что в прямом коде может быть записано как 1.010. В
то же время при непосредственном сложении получаем
,
то есть значение, существенно отличающееся от ожидаемого.
Процедура для корректного сложения чисел в прямом коде всё же существует, но она очень громоздка.
Прямой код имеет ещё один недостаток - нуль имеет два различных представления, а именно
и
,
что математически не имеет смысла.
По причине отмеченных недостатков в вычислительных машинах используется не прямой код, а обратный и дополнительный коды.
В этих системах кодирования чисел место расположения знакового разряда и способ кодирования остаются теми же, что и в прямом кодировании. Однако знаковый разряд уже не рассматривается как обособленный, а считается неотъемлемой частью числа аналогично разрядам модуля числа и совместно с ними.
Обратный код двоичного числа
Для отрицательных двоичных чисел процедура получения обратного кода следующая: в знаковой разряд записывается единица, а в цифровых разрядах прямого кода единицы заменяются нулями, а нули единицами.
Примеры обратного кода для правильных дробей:
.
Примеры обратного кода для целых чисел:
.
Как нетрудно заметить, положительные числа в прямом и обратном кодах выглядят одинаково.
Хотя обратный код и позволяет решить проблему сложения и вычитания чисел с различными
знаками, он имеет и недостатки. Во-первых, процесс суммирования чисел является двухэтапным, что увеличивает время выполнения
этой операции. Во-вторых, как и в прямом коде, в обратном - два представления нуля:
и
.
Дополнительный код двоичного числа
Дополнительный код отрицательного двоичного числа формируется по следующему правилу: в цифровых разрядах прямого кода единицы заменить нулями, а нули - единицами, после чего к младшему разряду прибавить единицу.
Для примера рассмотрим число X, которое в прямом коде имеет вид:
.
Тогда обратный код можно записать как
.
Для получения дополнительного кода прибавим 1 к младшему разряду обратного кода:
.
Примеры дополнительного кода для правильных дробей:
.
Примеры дополнительного кода для целых чисел:
.
Положительные числа в дополнительном коде записываются так же, как и в прямом. При представлении чисел в дополнительном коде есть только одна форма записи нуля: 0.0...00, причём ноль считается положительным числом, так как его знаковый бит равен 0.
В большинстве вычислительных машин отрицательные числа представлены в дополнительном коде.
Сложение и вычитание чисел в обратном и дополнительном кодах
Вычитание производится как сложение чисел, одно из которых с отрицательным знаком.
При выполнении алгебраического сложения знаковый разряд и цифры модуля рассматриваются как единое целое и обрабатываются совместно. Перенос из старшего (знакового) разряда в обратном и дополнительном кодах учитывается по-разному. В случае обратного кода единица переноса из знакового разряда прибавляется к младшему разряду суммы. При использовании дополнительного кода единица переноса из знакового разряда отбрасывается.
Пример 1. Сложить числа и
При использовании обратного кода получим:

При использовании дополнительного кода получим:

Если знаковый разряд результата равен нулю, это означает, что получено положительное число, которое выглядит так же, как и в прямом коде. Единица в знаковом разряде означает, что результат отрицательный и его запись соответствует представлению в том коде, в котором производилась операция.