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

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

Основные определения и понятия

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

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

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

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

Примеры кодов

Рассмотрим на примере как выглядят различные 8-битные представления числа 5:

  • Прямой код: 00000101
  • Обратный код: 00000101
  • Дополнительный код: 00000101

А вот для отрицательного числа -5:

  • Прямой код: 10000101
  • Обратный код: 11110110
  • Дополнительный код: 11111011

Достоинства и недостатки кодов

Достоинства прямого кода:

  • Простота реализации
  • Наглядность

Недостатки прямого кода:

  • Невозможность выполнить вычитание как сложение
  • "прямой дополнительный и обратный код отрицательного числа" сложно обрабатывать

Достоинства обратного кода:

  • Позволяет заменить вычитание на сложение

Недостатки обратного кода:

  • Два представления нуля
  • Усложненное сложение
Достоинства дополнительного кода Недостатки дополнительного кода
  • Унификация сложения и вычитания
  • Одно представление нуля
  • Более сложное получение кода

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

Запись положительных чисел

Для положительных чисел все три формата кодирования эквивалентны. Алгоритм записи положительного числа:

  1. Записать численное значение в двоичном виде
  2. Добавить нулевой старший разряд

Например, для десятичного числа 23 алгоритм будет следующий:

  1. 2310 = 000101112
  2. 0||00010111 = 000010111

Получаем 8-битное представление числа 23 для всех трех кодов:

  • Прямой код: 00000111
  • Обратный код: 00000111
  • Дополнительный код: 00000111

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

Городские экраны с бинарным кодом

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

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

Прямой код

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

  1. Получить двоичное представление модуля числа
  2. Добавить единицу в старший разряд как признак знака

Например, для числа -5:

  1. 510 = 000001012
  2. 1||00000101 = 10000101

Обратный код

В обратном коде алгоритм следующий:

  1. Получить прямой код модуля числа
  2. Инвертировать все биты
  3. Установить 1 в старший разряд

Для числа -5:

  1. 00000101
  2. 11111010
  3. 11110110
Программист пишет код

Дополнительный код

В дополнительном коде алгоритм еще проще:

  1. Взять прямой код числа
  2. Инвертировать все биты
  3. Прибавить 1

Пример для -5:

  1. 00000101
  2. 11111010
  3. 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 

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

Переполнение и ошибки

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

Признаки переполнения

Признаками переполнения при сложении являются:

  • Перенос из знакового разряда
  • Перенос в знаковый разряд

В этом случае результат необходимо считать некорректным.

Исправление ошибок

Для исправления ошибочных результатов можно:

  • Увеличить разрядность вычислений
  • Изменить порядок сложения слагаемых
  • Разбить вычисления на части

Выбор конкретного метода зависит от возможностей архитектуры и задачи.

Статья закончилась. Вопросы остались?
Комментарии 0
Подписаться
Я хочу получать
Правила публикации
Редактирование комментария возможно в течении пяти минут после его создания, либо до момента появления ответа на данный комментарий.