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


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

Прямой код двоичного числа
Обратный код двоичного числа
Дополнительный код двоичного числа

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

Прямой, обратный и дополнительный код
Мы знаем, что десятичное число можно представить в двоичном виде. К примеру, десятичное число 100 в двоичном виде будет равно 1100100, или в восьмибитном представлении 0110 0100. А как представить отрицательное десятичное число в двоичном виде и произвести с ним арифметические операции? Для этого и предназначены разные способы представления чисел в двоичном коде.
Сразу отмечу, что положительные числа в двоичном коде вне зависимости от способа представления (прямой, обратный или дополнительный коды) имеют одинаковый вид.


Прямой код

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

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

Неотрицательные числа в прямом кодеВ этом варианте (для восьмибитного двоичного числа) мы можем записать максимальное число 255 (всего чисел 256 - от 0 до 255)

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

Знаковый разряд прямого кода

В этом случае диапазон десятичных чисел, которые можно записать в прямом коде составляет от - 127 до +127:

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


Обратный код

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

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

При 8-битном двоичном числе - знаковый бит (как и в прямом коде) старший (8-й)

Двоичное число в обратном коде

Диапазон десятичных чисел, который можно записать в обратном коде от -127 до + 127

Арифметические операции с отрицательными числами в обратном коде:

(Арифметические операции с двоичными числами)

1-й пример (для положительного результата)
Дано два числа:
100 = 0110 0100
-25 = - 0001 1001
Необходимо их сложить:
100 + (-25) = 100 - 25 = 75

1-й этап
Переводим число -25 в двоичное число в обратном коде:
25 = 0001 1001
-25= 1110 0110
и складываем два числа:
0110 0100 (100) + 1110 0110 (-25) = 1 0100 1010, отбрасываем старшую 1 (у нас получился лишний 9-й разряд - переполнение), = 0100 1010
2-й этап
Отброшенную в результате старшую единицу прибавляем к результату:
0100 1010 + 1 = 0100 1011 (знаковый бит =0, значит число положительное), что равно 75 в десятичной системе

2-й пример (для отрицательного результата)
Дано два числа:
5 = 0000 0101
-10 = - 0000 1010
Необходимо их сложить:
5 + (-10) = 5 - 10 = -5

1-й этап
Переводим число -10 в двоичное число в обратном коде:
10 = 0000 1010
-10= 1111 0101
и складываем два числа:
0000 0101 (5) + 1111 0101 (-10) = 1111 1010 (знаковый бит =1, значит число отрицательное)

2-й этап
Раз результат получился отрицательный, значит число представлено в обратном коде.
Переводим результат в прямой код (путем инвертирования значения, знаковый бит не трогаем):
1111 1010 ----> 1000 0101
Проверяем:
1000 0101 = - 0000 0101 = -5


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


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

Дополнительный код - наиболее распространенный способ представления отрицательных чисел. Он позволяет заменить операцию вычитания на операцию сложения и сделать операции сложения и вычитания одинаковыми для знаковых и беззнаковых чисел.

В дополнительном коде (как и в прямом и обратном) старший разряд отводится для представления знака числа (знаковый бит).

Диапазон десятичных чисел которые можно записать в дополнительном коде от -128 до +127. Запись положительных двоичных чисел в дополнительном коде та-же, что и в прямом и обратном кодах.

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

Дополнительный код отрицательного числа можно получить двумя способами
1-й способ:
- инвертируем значение отрицательного числа, записанного в прямом коде (знаковый бит не трогаем)
- к полученной инверсии прибавляем 1
Пример:
Дано десятичное число -10
Переводим в прямой код:
10 = 0000 1010 ----> -10 = 1000 1010
Инвертируем значение (получаем обратный код):
1000 1010 ----> 1111 0101
К полученной инверсии прибавляем 1:
1111 0101 + 1 = 1111 0110 - десятичное число -10 в дополнительном коде

2-й способ:
Вычитание числа из нуля
Дано десятичное число 10, необходимо получить отрицательное число (-10) в дополнительном двоичном коде
Переводим 10 в двоичное число:
10 = 0000 1010
Вычитаем из нуля:
0 - 0000 1010 = 1111 0110 - десятичное число -10 в дополнительном коде

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

Арифметические операции с отрицательными числами в дополнительном коде

Дано: необходимо сложить два числа -10 и 5
-10 + 5 = -5
Решение:
5 = 0000 0101
-10 = 1111 0110 (в дополнительном коде)
Складываем:
1111 0110 + 0000 0101 = 1111 1011, что соответствует числу -5 в дополнительном коде

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


Вывод:
1. Для арифметических операций сложения и вычитания положительных двоичных чисел наиболее подходит применение прямого кода
2. Для арифметических операций сложения и вычитания отрицательных двоичных чисел наиболее подходит применение дополнительного кода


Предыдущие статьи:
1. Микроконтроллеры - первый шаг
2. Системы счисления: десятичная, двоичная и шестнадцатиричная
3. Логические операции, логические выражения, логические элементы
4. Битовые операции


(44 голосов, оценка: 4,68 из 5)

Загрузка...


Published by: Мир микроконтроллеров
Date Published: 04/15/2015



Комментарии

Прямой, обратный и дополнительный коды двоичного числа — 27 комментариев

  1. Зачем так с дополнительным кодом, можно же проще! Инвертировать все биты кроме последней единицы и нулей, которые после неё! Вообще, ни фига не врубаюсь. С дополнительным кодом складывают, с обратным тоже, почему это не одно и то же? Чем отличается операция сложения с обратным и дополнительным кодами? И что в принципе делается, если число больше чем одна ячейка оперативки, в том числе при переполнении? Операция производится с несколькими? И если оба числа отрицательные?

    • Может быть, предложенный вами метод тоже сработает, но использование дополнительного кода в этих вопросах является общепризнанным стандартом.

  2. Было бы неплохо объяснить не только что такое дополнительный и обратный коды и как переводить числа в них. Но также объяснить почему такой метод для арифметических операций с отрицательными числами вообще работает

    • Спасибо, Даниил. Мы учтем ваше пожелание и постараемся по мере наличия времени доработать статью в данном направлении

  3. А как перевести 0,11001 в прямой ,обратный и дополнительный коды? Играет ли роль запятая ?

    • прямой: 0,11001
      обратный: 0,11001
      дополнительный: 0,11001
      (т.к. число положительное, оно не изменяется)

      запятая отделает знаковый бит от информационных

  4. А зачем в обратном коде, в примере для отрицательного числа, ответ представлять в прямой код? Нельзя его так же оставить?

    • -5 в обратном коде = 11111010
      а вы его зачем-то переводите в прямой код, нельзя оставить ег ов обратном?

  5. Автор, спасибо за материал. Не подскажете, каким лучше воспользоваться приёмом, что бы грамотно разделить единицу на число 17-разрядное. Т.е. найти обратную величину этого числа. На посредственном камешке 2313. Спасибо.

  6. Что получим для переменной типа Long (32 бита со знаком) в результате операций:
    -(-2147483648)?
    -(-2147483647)?

    Ведь максимальное положительное значение 2147483647.

  7. Статейка классная, но: плохо что копировать не даёте.
    Решение вопроса: распечатываем на Microsoft XPS Document Writer.
    Сохраняем на раб. стол и открываем любым PDF просмотрщиком.
    зы: не стыдно людей мучать?

    • Уважаемый ЙЦУКЕН (странное имя, однако)!
      Не стыдно. На сайте имеется в вертикальном столбце с социальными кнопками - кнопка "Распечатать".
      В сети очень много умных сайтовладельцев, которые копируют чужие статьи и публикуют их у себя на сайте под своим именем, что не очень хорошо и красиво. В конечном итоге поисковые системы выбирают одну из двух одинаковых статей и включают ее в поиск, а вторую из поиска исключают. И не факт, что дубликат статьи не попадет в поиск, а оригинал не будет исключен из поиска.
      С уважением, Admin.

      • Ваша проблема в том, что все копипастеры давно умеют обходить блокировку копирования.
        А вот нормальные люди мучаются !

        • Здравствуйте Василий!
          Я понимаю мучение народа, но еще раз повторю: в вертикальном блоке кнопок на странице сайта, предпоследняя - печать. Нажмите, распечатайте и пользуйтесь на здоровье, тем более, что распечатывается не вся страница целиком, а только текст.
          А по поводу умных копипастеров могу только сказать, по собственному опыту, что на своем бывшем сайте (radio-stv.ru, к сожалению пришлось продать) до постановки защиты, стабильно одна-две статьи в месяц уходило налево, после установки защиты - ноль.
          Я свой труд ценю, халявщиков не люблю, а владельцам сайтов, которые просят разрешения на перепечатку, отдаю даже без требований обратной ссылки.
          С уважением, Admin.

  8. Во втором пункте Выводов ошибочно вместо дополнительного кода указан обратный.

  9. Здравствуйте,
    я так понимаю это ошибка, скорее опечатка в последней строчке (Дополнительный код отриц. числа, 1-й способ)
    1000 0101 + 1 = 1111 0110
    должно же быть
    1111 0101 + 1 = 1111 0110

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *