Прямой, дополнительный и обратный коды являются фундаментальными понятиями в информатике и компьютерных технологиях. Они лежат в основе представления чисел в памяти компьютеров и других электронных устройств. Давайте разберемся, что это за коды, как они устроены и для чего используются.
Основные определения и понятия
Прямой код - способ представления неотрицательных чисел в двоичном формате. Код состоит из абсолютного значения числа и отдельного разряда для обозначения знака (0 для положительных чисел).
Обратный код позволяет заменить операцию вычитания на операцию сложения. Положительные числа записываются как в прямом коде. Отрицательные числа получаются инвертированием бит прямого кода модуля числа с единицей в старшем разряде.
Дополнительный код является наиболее распространенным способом хранения отрицательных чисел. Позволяет унифицировать операции сложения и вычитания. Получается инвертированием всех бит прямого кода числа и прибавлением единицы.
Прямой дополнительный и обратный код позволяет компьютеру работать с положительными и отрицательными числами, выполняя различные математические операции.
Примеры кодов
Рассмотрим на примере как выглядят различные 8-битные представления числа 5:
- Прямой код: 00000101
- Обратный код: 00000101
- Дополнительный код: 00000101
А вот для отрицательного числа -5:
- Прямой код: 10000101
- Обратный код: 11110110
- Дополнительный код: 11111011
Достоинства и недостатки кодов
Достоинства прямого кода:
- Простота реализации
- Наглядность
Недостатки прямого кода:
- Невозможность выполнить вычитание как сложение
- "прямой дополнительный и обратный код отрицательного числа" сложно обрабатывать
Достоинства обратного кода:
- Позволяет заменить вычитание на сложение
Недостатки обратного кода:
- Два представления нуля
- Усложненное сложение
Достоинства дополнительного кода | Недостатки дополнительного кода |
|
|
Таким образом, несмотря на некоторую сложность реализации, прямой, дополнительный и обратный коды чисел чаще всего используют в дополнительном формате, как наиболее удобном для вычислений.
Запись положительных чисел
Для положительных чисел все три формата кодирования эквивалентны. Алгоритм записи положительного числа:
- Записать численное значение в двоичном виде
- Добавить нулевой старший разряд
Например, для десятичного числа 23
алгоритм будет следующий:
- 2310 = 000101112
- 0||00010111 = 000010111
Получаем 8-битное представление числа 23
для всех трех кодов:
- Прямой код: 00000111
- Обратный код: 00000111
- Дополнительный код: 00000111
То есть, прямой, дополнительный и обратный коды - пример записи положительного числа 23 во всех случаях одинаков.

Представление отрицательных чисел
В отличие от положительных чисел, для отрицательных значений используются разные форматы кодирования в зависимости от выбранного кода.
Прямой код
В прямом коде отрицательные числа записывают следующим образом:
- Получить двоичное представление модуля числа
- Добавить единицу в старший разряд как признак знака
Например, для числа -5:
- 510 = 000001012
- 1||00000101 = 10000101
Обратный код
В обратном коде алгоритм следующий:
- Получить прямой код модуля числа
- Инвертировать все биты
- Установить 1 в старший разряд
Для числа -5:
- 00000101
- 11111010
- 11110110

Дополнительный код
В дополнительном коде алгоритм еще проще:
- Взять прямой код числа
- Инвертировать все биты
- Прибавить 1
Пример для -5:
- 00000101
- 11111010
- 11111011
Преимущества дополнительного кода
Из приведенных примеров видно, что прямой, дополнительный и обратный код отрицательных чисел в дополнительном формате получается проще всего. Это одно из ключевых преимуществ дополнительного кода.
Другие достоинства:
- Единообразие сложения и вычитания
- Однозначное представление нуля
Поэтому дополнительный код стал стандартом де-факто для хранения и обработки отрицательных чисел в компьютерах и других цифровых устройствах.
Особенности вычислений
При использовании дополнительного кода выполнение арифметических операций имеет некоторые особенности, о которых нужно помнить:
Переносы при сложении
При сложении двух чисел в дополнительном коде может возникнуть перенос за пределы разрядной сетки. Например:
A = 01111111 (127) B = 00000001 (1) A + B =10000000
Формально получилось отрицательное число. Но поскольку перенос появился из старшего значащего разряда, это говорит об ошибке переполнения. В таком случае результат необходимо интерпретировать как 0, игнорировав лишний старший разряд.
Выравнивание разрядности
Перед сложением важно выровнять числа по разрядности, добавляя незначащие нули:
A = 1010 (10) B = 111 (7) A = 00001010 B = 000001111
После этого можно выполнять операцию.
Операция вычитания
Вычитание заменяется на сложение с дополнительным кодом. Например, для выражения А - В нужно найти дополнительный код числа В и прибавить к А:
A = 0110 (6) B = 0011 (3) -B (доп. код B) = 1101 A + (-B) = 0110 + 1101 = 1001 (6 - 3 = 3)
Правила работы со знаковым разрядом
При вычислениях важно правильно определять знак результата на основе знакового бита:
- 0 означает положительное число
- 1 означает отрицательное число
Если после операции получился 0 в старшем разряде, результат - положительное число, представленное в прямом коде. Если 1 - отрицательное в дополнительном коде.
Особые ситуации
Рассмотрим несколько особых случаев при вычислениях.
Сложение с нулем
Сложение любого числа с нулем в любом формате кода дает исходное число:
Сложение числа самого с собой
Если сложить число в дополнительном коде само с собой, то в зависимости от знака результат будет разный:
- Для положительного числа произойдет удвоение значения
- Для отрицательного числа в результате будет 0
Это свойство иногда используется на практике для быстрого удвоения положительных чисел.
Сложение с противоположным числом
Если сложить число со своим дополнительным кодом (противоположным значением), то в любом случае в результате будет 0. Например:
A = 1010 (-6) -A (доп.) = 0110 (6) A + (-A) = 0
Это свойство также используется на практике для быстрого взаимного уничтожения чисел.
Переполнение и ошибки
При вычислениях в дополнительном коде возможны ситуации переполнения разрядной сетки или получения неверного результата. Рассмотрим способы их обнаружения и исправления.
Признаки переполнения
Признаками переполнения при сложении являются:
- Перенос из знакового разряда
- Перенос в знаковый разряд
В этом случае результат необходимо считать некорректным.
Исправление ошибок
Для исправления ошибочных результатов можно:
- Увеличить разрядность вычислений
- Изменить порядок сложения слагаемых
- Разбить вычисления на части
Выбор конкретного метода зависит от возможностей архитектуры и задачи.