Двоичное число: прямой, обратный и дополнительный коды
Прямой код двоичного числа
Обратный код двоичного числа
Дополнительный код двоичного числа
Прямой, обратный и дополнительный коды двоичного числа - способы представления двоичных чисел с фиксированной запятой в компьютерной (микроконтроллерной) арифметике, предназначенные для записи отрицательных и неотрицательных чисел
Мы знаем, что десятичное число можно представить в двоичном виде. К примеру, десятичное число 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. Битовые операции
Спасибо!
Спасибо огромное!!!
Это база
Да, это базовые знания для освоения программирования микроконтроллеров, с этим не поспоришь
Зачем так с дополнительным кодом, можно же проще! Инвертировать все биты кроме последней единицы и нулей, которые после неё! Вообще, ни фига не врубаюсь. С дополнительным кодом складывают, с обратным тоже, почему это не одно и то же? Чем отличается операция сложения с обратным и дополнительным кодами? И что в принципе делается, если число больше чем одна ячейка оперативки, в том числе при переполнении? Операция производится с несколькими? И если оба числа отрицательные?
Может быть, предложенный вами метод тоже сработает, но использование дополнительного кода в этих вопросах является общепризнанным стандартом.
Было бы неплохо объяснить не только что такое дополнительный и обратный коды и как переводить числа в них. Но также объяснить почему такой метод для арифметических операций с отрицательными числами вообще работает
Спасибо, Даниил. Мы учтем ваше пожелание и постараемся по мере наличия времени доработать статью в данном направлении
А как перевести 0,11001 в прямой ,обратный и дополнительный коды? Играет ли роль запятая ?
прямой: 0,11001
обратный: 0,11001
дополнительный: 0,11001
(т.к. число положительное, оно не изменяется)
запятая отделает знаковый бит от информационных
А зачем в обратном коде, в примере для отрицательного числа, ответ представлять в прямой код? Нельзя его так же оставить?
-5 в обратном коде = 11111010
а вы его зачем-то переводите в прямой код, нельзя оставить ег ов обратном?
А что дальше читать? 🙂 Так чтобы азы и по порядку 🙂
Шикарное и доступное изложение азов!!! Браво!!!!!!!!
прямой обратный и дополнительный коды
Спасибо, исправил.
Автор, спасибо за материал. Не подскажете, каким лучше воспользоваться приёмом, что бы грамотно разделить единицу на число 17-разрядное. Т.е. найти обратную величину этого числа. На посредственном камешке 2313. Спасибо.
Я в восторге от Вашего объяснения темы! Спасибо!
Что получим для переменной типа Long (32 бита со знаком) в результате операций:
-(-2147483648)?
-(-2147483647)?
Ведь максимальное положительное значение 2147483647.
Статейка классная, но: плохо что копировать не даёте.
Решение вопроса: распечатываем на Microsoft XPS Document Writer.
Сохраняем на раб. стол и открываем любым PDF просмотрщиком.
зы: не стыдно людей мучать?
Уважаемый ЙЦУКЕН (странное имя, однако)!
Не стыдно. На сайте имеется в вертикальном столбце с социальными кнопками - кнопка "Распечатать".
В сети очень много умных сайтовладельцев, которые копируют чужие статьи и публикуют их у себя на сайте под своим именем, что не очень хорошо и красиво. В конечном итоге поисковые системы выбирают одну из двух одинаковых статей и включают ее в поиск, а вторую из поиска исключают. И не факт, что дубликат статьи не попадет в поиск, а оригинал не будет исключен из поиска.
С уважением, Admin.
Ваша проблема в том, что все копипастеры давно умеют обходить блокировку копирования.
А вот нормальные люди мучаются !
Здравствуйте Василий!
Я понимаю мучение народа, но еще раз повторю: в вертикальном блоке кнопок на странице сайта, предпоследняя - печать. Нажмите, распечатайте и пользуйтесь на здоровье, тем более, что распечатывается не вся страница целиком, а только текст.
А по поводу умных копипастеров могу только сказать, по собственному опыту, что на своем бывшем сайте (radio-stv.ru, к сожалению пришлось продать) до постановки защиты, стабильно одна-две статьи в месяц уходило налево, после установки защиты - ноль.
Я свой труд ценю, халявщиков не люблю, а владельцам сайтов, которые просят разрешения на перепечатку, отдаю даже без требований обратной ссылки.
С уважением, Admin.
Огромное спасибо за статью!!!
Во втором пункте Выводов ошибочно вместо дополнительного кода указан обратный.
Здравствуйте,
я так понимаю это ошибка, скорее опечатка в последней строчке (Дополнительный код отриц. числа, 1-й способ)
1000 0101 + 1 = 1111 0110
должно же быть
1111 0101 + 1 = 1111 0110
Здравствуйте Денис!
Спасибо за замеченную ошибку, исправил.
С уважением, Admin.