Компьютеры
и программирование

Коды двоичных чисел

Виды кодов отрицательных чисел

В принципы работы вычислительных машин заложен принцип двоичного кодирования: все данные представлены в виде закодированных некоторым образом двоичных чисел. коды двоичных чисел необходимы для того, чтобы производить над данными логические и арифметические операции.

В статье "Системы счисления" мы рассматривали только положительные числа. При записи двоичных чисел со знаком в их формате необходимо предусмотреть два поля: поле, определяющее знак числа, и поле, характеризующее модуль числа. Под знак числа отводится специальный знаковый бит (двоичный разряд). Остальные разряды определяют модуль числа. Знаковый разряд приписывается слева от модуля числа, причём знаку "+" соответствует нулевое значение знакового бита, а знаку "-" - единичное.

В истории развития компьютеров использовались три основных варианта представления знаковых чисел:

  • прямой код или знак и величина;
  • обратный код или код с дополнением до единицы;
  • дополнительный код или код с дополнением до двух.

Во всех трёх кодах положительные числа выглядят одинаково. Различия в форме записи отрицательных чисел в обратном и дополнительном кодах касаются только способа представления модуля числа, а способ кодирования и место расположения знакового бита остаются неизменными.

Прямой код двоичного числа

В системе представления в прямом коде число состоит из кода знака и модуля числа, причём обе эти части обрабатываются по отдельности.

Примеры прямого кода для правильных дробей:

Примеры прямого кода для целых чисел:

Представление чисел в прямом коде имеет существенный недостаток - формальное суммирование чисел с различающимися знаками даёт неверный результат. Пример - сложение двух чисел и . В прямом коде эти числа имеют вид: и . Очевидно, что результат должен быть равен -2, что в прямом коде может быть записано как 1.010. В то же время при непосредственном сложении получаем

,

то есть значение, существенно отличающееся от ожидаемого.

Процедура для корректного сложения чисел в прямом коде всё же существует, но она очень громоздка. Прямой код имеет ещё один недостаток - нуль имеет два различных представления, а именно и , что математически не имеет смысла.

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

В этих системах кодирования чисел место расположения знакового разряда и способ кодирования остаются теми же, что и в прямом кодировании. Однако знаковый разряд уже не рассматривается как обособленный, а считается неотъемлемой частью числа аналогично разрядам модуля числа и совместно с ними.

Обратный код двоичного числа

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

Примеры обратного кода для правильных дробей:

.

Примеры обратного кода для целых чисел:

.

Как нетрудно заметить, положительные числа в прямом и обратном кодах выглядят одинаково.

Хотя обратный код и позволяет решить проблему сложения и вычитания чисел с различными знаками, он имеет и недостатки. Во-первых, процесс суммирования чисел является двухэтапным, что увеличивает время выполнения этой операции. Во-вторых, как и в прямом коде, в обратном - два представления нуля: и .

Дополнительный код двоичного числа

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

Для примера рассмотрим число X, которое в прямом коде имеет вид:

.

Тогда обратный код можно записать как

.

Для получения дополнительного кода прибавим 1 к младшему разряду обратного кода:

.

Примеры дополнительного кода для правильных дробей:

.

Примеры дополнительного кода для целых чисел:

.

Положительные числа в дополнительном коде записываются так же, как и в прямом. При представлении чисел в дополнительном коде есть только одна форма записи нуля: 0.0...00, причём ноль считается положительным числом, так как его знаковый бит равен 0.

В большинстве вычислительных машин отрицательные числа представлены в дополнительном коде.

Сложение и вычитание чисел в обратном и дополнительном кодах

Вычитание производится как сложение чисел, одно из которых с отрицательным знаком.

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

Пример 1. Сложить числа и

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

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

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