Дополнительный код (англ. two’s complement , иногда twos-complement) — наиболее распространённый способ представления отрицательных целых чисел в компьютерах. Он позволяет заменить операцию вычитания на операцию сложения и сделать операции сложения и вычитания одинаковыми для знаковых и беззнаковых чисел, чем упрощает архитектуру ЭВМ. Дополнительный код отрицательного числа можно получить инвертированием модуля двоичного числа (первое дополнение) и прибавлением к инверсии единицы (второе дополнение). Либо вычитанием числа из нуля.
Дополнительный код (дополнение до 2) двоичного числа получается добавлением 1 к младшему значащему разряду его дополнения до 1. [1]
Дополнение до 2 двоичного числа определяется как величина полученная вычитанием числа из наибольшей степени двух (из 2 N для N-битного дополнения до 2). [2]
Представление числа в дополнительном коде
При записи числа в дополнительном коде старший разряд является знаковым. Если его значение равно 0, то в остальных разрядах записано положительное двоичное число, совпадающее с прямым кодом. Если же знаковый разряд равен 1, то в остальных разрядах записано отрицательное двоичное число, преобразованное в дополнительный код. Для получения значения, которое противоположно по знаку, все разряды, включая знаковый, инвертируются, а затем к результату добавляется единица.
Двоичное 8-ми разрядное число со знаком в дополнительном коде может представлять любое целое в диапазоне от −128 до +127. Если старший разряд равен нулю, то наибольшее целое число, которое может быть записано в оставшихся 7 разрядах равно 2^7-1, что равно 127.
127 | 01111111 | 01111111 |
1 | 00000001 | 00000001 |
0 | 00000000 | 00000000 |
-0 | 10000000 | ——— |
-1 | 10000001 | 11111111 |
-2 | 10000010 | 11111110 |
-3 | 10000011 | 11111101 |
-4 | 10000100 | 11111100 |
-5 | 10000101 | 11111011 |
-6 | 10000110 | 11111010 |
-7 | 10000111 | 11111001 |
-8 | 10001000 | 11111000 |
-9 | 10001001 | 11110111 |
-10 | 10001010 | 11110110 |
-11 | 10001011 | 11110101 |
-127 | 11111111 | 10000001 |
-128 | ——— | 10000000 |
При применении той же идеи к привычной 10-ричной системе счисления получится (например, для гипотетического процессора использующего 10-ричную систему счисления):
дополнительный код.avi
. | . |
13 | 0013 |
12 | 0012 |
11 | 0011 |
10 | 0010 |
9 | 0009 |
8 | 0008 |
. | . |
2 | 0002 |
1 | 0001 |
0 | 0000 |
-1 | 9999 |
-2 | 9998 |
-3 | 9997 |
-4 | 9996 |
. | . |
-9 | 9991 |
-10 | 9990 |
-11 | 9989 |
-12 | 9988 |
. | . |
Прямой, дополнительный и обратный коды
Прямой, дополнительный и обратный код числа (создан по запросу).
Далее идет калькулятор, который переводит введенное положительное или отрицательное целое число в двоичный код, а также выводит обратный код этого числа и его дополнительный код. Под калькулятором, как водится, немного теории.
Обновление: Из комментариев становится ясно, что люди не вполне понимают, что делает этот калькулятор. Точнее, что делал — применял алгоритм вычисления дополнительного кода к любому числу. Люди хотят, чтобы он им просто показывал дополнительный код числа. Ну хорошо — теперь при вводе положительного числа калькулятор показывает представление числа в двоичной форме, ибо для него нет обратного и дополнительного кода, а при вводе отрицательного показывает дополнительный и обратный код.
Прямой, дополнительный и обратный код
Число двоичных разрядов
Рассчитать
Представление положительного числа
Обратный код
Дополнительный код
Ссылка Сохранить Виджет
Прямой код числа это представление беззнакового двоичного числа. Если речь идет о машинной арифметике, то как правило на представление числа отводится определенное ограниченное число разрядов. Диапазон чисел, который можно представить числом разрядов n равен
Обратный код числа, или дополнение до единицы (one’s complement) это инвертирование прямого кода (поэтому его еще называют инверсный код). То есть все нули заменяются на единицы, а единицы на нули.
Дополнительный код числа, или дополнение до двойки (two’s complement) это обратный код, к младшему значащему разряду которого прибавлена единица
А это все для удобной работы со знаками. Поскольку я все люблю понимать на примерах, рассказывать я тоже буду на примерах. Итак, предположим, что у нас 4 разряда для работы с двоичными числами. Представить таким образом можно 16 чисел — 0, 1, . 15
00 — 0000
.
15 — 1111
Но если нет знака, убогая получается арифметика. Нужно вводить знак. Чтобы никого не обидеть, половину диапазона отдадим положительным числам (8 чисел), половину — отрицательным (тоже 8 чисел). Ноль, что отличает машинную арифметику от обычной, мы отнесем в положительные числа (в обычной арифметике у нуля нет знака, если не ошибаюсь). Итого, в положительные числа попадают 0. 7, а в отрицательные -1, . -8.
Для различия положительных и отрицательных чисел выделяют старший разряд числа, который называется знаковым (sign bit)
0 в этом разряде говорит нам о том, что это положительное число, а 1 — отрицательное.
С положительными числами все вроде бы понятно, для их представления можно использовать прямой код
0 — 0000
1 — 0001
7 — 0111
А как представить отрицательные числа?
Вот для их представления как раз и используется дополнительный код.
То есть, -7 в дополнительном коде получается так
прямой код 7 = 0111
обратный код 7 = 1000
дополнительный код 7 = 1001
Обратим внимание на то, что прямой код 1001 представляет число 9, которое отстоит от числа -7 ровно на 16, или .
Или, что тоже самое, дополнительный код числа «дополняет» прямой код до , т.е. 7+9=16
И это оказалось очень удобно для машинных вычислений — при таком представлении отрицательного числа операции сложения и вычитания можно реализовать одной схемой сложения, при этом очень легко определять переполнение результата (когда для представления получившегося числа не хватает разрядности)
Пара примеров
7-3=4
0111 прямой код 7
1101 дополнительный код 3
0100 результат сложения 4
-1+7=6
1111 дополнительный код 1
0111 прямой код 7
0110 результат сложения 6
Что касается переполнения — оно определяется по двум последним переносам, включая перенос за старший разряд. При этом если переносы 11 или 00, то переполнения не было, а если 01 или 10, то было. При этом, если переполнения не было, то выход за разряды можно игнорировать.
Примеры где показаны переносы и пятый разряд
00111 прямой код 7
00001 прямой код 1
01110 переносы
01000 результат 8 — переполнение
Два последних переноса 01 — переполнение
-7+7=0
00111 прямой код 7
01001 дополнительный код 7
11110 переносы
10000 результат 16 — но пятый разряд можно игнорировать, реальный результат 0
Два последних переноса 11 з перенос в пятый разряд можно отбросить, оставшийся результат, ноль, арифметически корректен.
Опять же проверять на переполнение можно простейшей операцией XOR двух бит переносов.
Вот благодаря таким удобным свойствам дополнительный код это самый распространенный способ представления отрицательных чисел в машинной арифметике.
P.S. Ну а обратный код дополняет число до , или до всех 1, потому и называется дополнением до 1. Им тоже можно представлять отрицательные числа, и реализовать вычитание и сложение схемой сложения, только сложение там хитрее — с циклическим переносом, ну и представить можно меньше на одно число, так как все единицы уже заняты — это обратный код нуля, эдакий «минус нуль», то есть диапазон получается, если брать наш пример от -7 до 7. Не так удобно, одним словом.
Дополнительный код/запись отрицательных чисел в памяти компьютера
В данной короткой статье будет рассмотрен дополнительный код — способ записи знаковых чисел (как положительных так и отрицательных). Мы не просто рассмотрим формальную сторону вопроса, но и увидим какой смысл и какая интуиция стоит за данным решением, иными словами попытаемся прийти к созерцанию дополнительного кода.
Для того, чтобы в полной мере что-либо понять, нужно это сотворить. Зададимся себе этой целью.
В памяти компьютера мы можем хранить исключительно целые неотрицательные числа с конечной разрядностью. Пускай у нас в распоряжении есть 8 бит, в которые нам нужно уместить по некоторому правилу как положительные, так и отрицательные числа.
Первое, что может прийти в голову — это отводить старший бит под знак, положим, 1 значит, что число отрицательное, а 0 — положительное. Но в таком случае сложив, например, 3 и -1 мы получим:
000000112 + 100000012 = 100001002 = 13210
что отличается от ожидаемой нами двойки. К тому же такой способ записи знаковых чисел допускает существование положительного и отрицательного ноля. Конечно мы бы могли аппаратно обрабатывать подобные знаковые числа, но это бы сильно усложнило разработку процессоров и увеличило бы вычислительные затраты для работы со знаковыми числами. Следовательно, нам нужно придумать такой тип записи, при котором бы мы получали корректный результат при прямом сложении положительного числа с отрицательным.
Логично было бы разделить весь диапазон чисел, доступных нам в восьми разрядах, пополам, чтобы одну половину занимали положительные числа, а вторую обратные к ним по сложению. Возьмем, к примеру, число 3. Попробуем отыскать для него обратное по сложению, то есть такое число, которое при сложении с тройкой даст нам 0. Число 3 в двоичном коде записывается как 00000011. Как же нам с помощью сложения из него получить ноль? Для этого результатом нашего сложения должно быть число 100000000. Так как наше число восьмиразрядное, то самая старшая единичка отбросится, и в наших восьми разрядах мы будем иметь 00000000.
На этом моменте читателю предлагается остановиться и немного подумать, как из 00000011 получить обратное к нему по сложению.
Для того, чтобы из 00000011 получить обратное, нужно для начала инвертировать все его биты (единицу заменить нулем, а ноль — единицей), ибо в таком случае при сложении мы получим 11111111, а затем прибавить единицу, чтобы получить 100000000, чего мы и добивались. Итак, число -3 в дополнительном коде выглядит как 11111101. Очевидно, что подобным образом мы сможем найти обратное число к любому из нашего диапазона 8-битных чисел, ибо мы находимся в кольце классов вычетов по модулю 2 8 (если не в курсах, что такое кольца классов вычетов — забейте). Для того, чтобы запись каждого числа была однозначной, положительными числам считаются все от 00000001 до 01111111, отрицательными — все от 10000000 до 11111111. Иначе бы мы не знали как интерпретировать число, например, 10000101: то ли как 133, то ли как -123. Таким образом, в наши 8 бит мы можем записать числа от -128 до 127.
Поздравляю, теперь вы знаете, как компьютер представляет отрицательные числа, и не будете дивиться тому, что при инвертировании битов знакового числа вы чудесным образом получаете отрицательное число, по модулю большее на единицу.
- дополнительный код
- информатика
- отрицательные числа
- знаковые числа
- signed binary
Дополнительный код
Дополнительный код — наиболее распространенный способ представления отрицательных чисел. Он позволяет заменить операцию вычитания на операцию сложения и сделать операции сложения и вычитания одинаковыми для знаковых и беззнаковых чисел.
В дополнительном коде (как и в прямом и обратном) старший разряд отводится для представления знака числа (знаковый бит).
Диапазон десятичных чисел которые можно записать в дополнительном коде от -128 до +127. Запись положительных двоичных чисел в дополнительном коде та-же, что и в прямом и обратном кодах.
Дополнительный код отрицательного числа можно получить двумя способами
1-й способ:
— инвертируем значение отрицательного числа, записанного в прямом коде (знаковый бит не трогаем)
— к полученной инверсии прибавляем 1
Пример:
Дано десятичное число -10
Переводим в прямой код:
10 = 0 000 1010 —-> -10 = 1 000 1010
Инвертируем значение (получаем обратный код):
1 000 1010 —-> 1 111 0101
К полученной инверсии прибавляем 1:
1 111 0101 + 1 = 1 111 0110 — десятичное число -10 в дополнительном коде
2-й способ:
Вычитание числа из нуля
Дано десятичное число 10, необходимо получить отрицательное число (-10) в дополнительном двоичном коде
Переводим 10 в двоичное число:
10 = 0 000 1010
Вычитаем из нуля:
0 — 0000 1010 = 1 111 0110 — десятичное число -10 в дополнительном коде
Арифметические операции с отрицательными числами в дополнительном коде
Дано: необходимо сложить два числа -10 и 5
-10 + 5 = -5
Решение:
5 = 0000 0101
-10 = 1111 0110 (в дополнительном коде)
Складываем:
1111 0110 + 0000 0101 = 1111 1011, что соответствует числу -5 в дополнительном коде
Как мы видим на этом примере — дополнительный код отрицательного двоичного числа наиболее подходит для выполнения арифметических операций сложения и вычитания отрицательных чисел.
Вывод:
1. Для арифметических операций сложения и вычитания положительных двоичных чисел наиболее подходит применение прямого кода
2. Для арифметических операций сложения и вычитания отрицательных двоичных чисел наиболее подходит применение дополнительного кода
(42 голосов, оценка: 4,67 из 5)
Прямой, обратный и дополнительный коды
Очень часто в вычислениях должны использоваться не только положительные, но и отрицательные числа.
Число со знаком в вычислительной технике представляется путем представления старшего разряда числа в качестве знакового .
Принято считать, что 0 в знаковом разряде означает знак «плюс» для данного числа, а 1 – знак «минус».
Выполнение арифметических операций над числами с разными знаками представляется для аппаратной части довольно сложной процедурой. В этом случае нужно определить большее по модулю число, произвести вычитание и присвоить разности знак большего по модулю числа.
Применение дополнительного кода позволяет выполнить операцию алгебраического суммирования и вычитания на обычном сумматоре. При этом не требуется определения модуля и знака числа.
Прямой код представляет собой одинаковое представление значимой части числа для положительных и отрицательных чисел и отличается только знаковым битом. В прямом коде число 0 имеет два представления «+0» и «–0».
Обратный код для положительных чисел имеет тот же вид, что и прямой код, а для отрицательных чисел образуется из прямого кода положительного числа путем инвертирования всех значащих разрядов прямого кода. В обратном коде число 0 также имеет два представления «+0» и «–0».
Дополнительный код для положительных чисел имеет тот же вид, что и прямой код, а для отрицательных чисел образуется путем прибавления 1 к обратному коду. Добавление 1 к обратному коду числа 0 дает единое представление числа 0 в дополнительном коде. Однако это приводит к асимметрии диапазонов представления чисел относительно нуля.
Так, в восьмиразрядном представлении диапазон изменения чисел с учетом знака.
Таблица прямого, обратного и дополнительного кода 4-битных чисел. Для наглядности представления всего диапазона чисел примем, что сетка представления чисел 4-разрядная, где старший разряд (3) — знаковый, а 0-2 разряды содержат значение числа.
Число | Прямой код | Обратный код | Дополнительный код |
-8 | — | — | 1000 |
-7 | 1111 | 1000 | 1001 |
-6 | 1110 | 1001 | 1010 |
-5 | 1101 | 1010 | 1011 |
-4 | 1100 | 1011 | 1100 |
-3 | 1011 | 1100 | 1101 |
-2 | 1010 | 1101 | 1110 |
-1 | 1001 | 1110 | 1111 |
0 0 | 1000 0000 | 1111 0000 | 0000 |
1 | 0001 | 0001 | 0001 |
2 | 0010 | 0010 | 0010 |
3 | 0011 | 0011 | 0011 |
4 | 0100 | 0100 | 0100 |
5 | 0101 | 0101 | 0101 |
6 | 0110 | 0110 | 0110 |
7 | 0111 | 0111 | 0111 |
Прямой, обратный и дополнительный коды
Следует подчеркнуть, что положительные числа в двоичном коде не зависимо от метода их представления, то есть в прямом, обратном или дополнительном кодах, обладают одинаковым видом.
Прямой код является методом отображения двоичных чисел с фиксированной запятой, который в основном применяется для записи неотрицательных чисел. Прямой код может применяться в следующих вариантах:
- В основном варианте он служит для записи только неотрицательных чисел. В этом случае для восьми битного двоичного числа может быть записано максимальное число 255 (всего чисел 256, то есть, от нуля до 255).
- Во втором варианте он служит для записи как положительных, так и отрицательных чисел.
Во втором случае старший бит принято считать знаковым разрядом (знаковым битом). Причём, если:
- Знаковый разряд равняется нулю, то число является положительным.
- Знаковый разряд равняется единице, то число является отрицательным.
В таком варианте диапазон десятичных чисел, которые могут быть записаны в прямом коде, составляет от — 127 до +127.
Начинай год правильно
Выигрывай призы на сумму 400 000 ₽
Таким образом, на основании изложенного выше можно сделать вывод, что прямой код может применяться в основном для представления неотрицательных чисел. Применение прямого кода для представления отрицательных чисел считается малоэффективным, поскольку при этом достаточно сложно реализовать арифметические операции и, помимо этого, в прямом коде существует два представления нуля, а именно, положительный нуль и отрицательный нуль (чего не бывает).
Обратный код является способом вычислительной математики, который позволяет осуществить вычитание одного числа из другого, применяя лишь операцию суммирования. Обратный двоичный код положительного числа представляет собой одноразрядный код знака, то есть, двоичного числа нуль, за которым должно следовать числовое значение.
Обратные двоичные коды отрицательных чисел представляет собой одноразрядный код знака, а именно, двоичную цифру единица, за которой должны следовать инвертированные значения положительных чисел. Для положительных чисел обратный код двоичных чисел обладает таким же видом, что и представление неотрицательных чисел в прямом коде.
Для отрицательных чисел обратный код может быть получен из неотрицательного числа в прямом коде, путем инвертирования всех битов, то есть, единицы заменяются нулями, а нули должны быть заменены на единицы. Для преобразования отрицательного числа, которое записано в обратном коде, в положительное необходимо просто выполнить его инвертирование. Для восьми битного двоичного числа знаковым битом, как и в прямом коде, является старший, то есть, восьмой бит. Диапазон десятичных чисел, которые могут быть записаны в обратном коде, простирается от -127 до + 127. Ниже приведены примеры записи чисел в обратном коде.
Рисунок 1. Примеры записи чисел в обратном коде. Автор24 — интернет-биржа студенческих работ
Далее рассмотрим выполнение арифметических операций с отрицательными числами в обратном коде (арифметические операции с двоичными числами).
Имеем следующие два числа:
Необходимо выполнить их сложение, которое в десятичном формате имеет общеизвестный вид:
100 + (–25) = 100 — 25 = 75
Для реализации этой операции в двоичных кодах, необходимо сначала выполнить перевод числа -25 в двоичное число в обратном коде:
Затем необходимо осуществить собственно операцию сложения двух чисел:
0110 0100 (100) + 1110 0110 (–25) = 1 0100 1010.
Старший единичный разряд необходимо отбросить, так как получился лишний девятый разряд, как результат переполнения:
Далее отброшенную в результате старшую единицу следует прибавить к результату:
0100 1010 + 1 = 0100 1011.
При этом знаковый бит равняется нулю и это означает, что число является положительным и равным 75 в десятичной системе.
Обратный код способен решить проблему сложения и вычитания чисел с разными знаками, но также и обладает определёнными недостатками:
- Для выполнения арифметических операций необходимо осуществить два этапа.
- Как и для прямого кода существует два представления нуля, а именно, положительный и отрицательный.
Дополнительный код является самым распространенным способом представления отрицательных чисел. Он предоставляет возможность замены операции вычитания операцией сложения, а также позволяет сделать операции сложения и вычитания одинаковыми для знаковых и без знаковых чисел.
Дополнительный код, аналогично прямому и обратному кодам, использует старший разряд для обозначения знака числа, то есть, этот разряд является знаковым битом. Диапазон десятичных чисел, которые могут быть записаны в дополнительном коде, простирается от -128 до +127. Запись положительных двоичных чисел в дополнительном коде выполняется так же, как и в прямом и обратном кодах.
Дополнительный код отрицательного числа может быть получен следующими способами:
- Необходимо выполнить инвертирование значения отрицательного числа, которое записано в прямом коде (знаковый бит сюда не входит), а к полученной инверсии следует прибавить единицу.
- Необходимо выполнить вычитание преобразуемого числа из нуля.
Прямой код и дополнительный код
Старший бит в целых числах со знаком используется для обозначения знака. Для положительных чисел он всегда равен 0. В отрицательных числах старший бит всегда равен 1. Такая запись числа в двоичной системе счисления называется прямой код.
Таким образом, в двоичной системе счисления, используя прямой код, в восьмиразрядной ячейке (байте) можно записать семи разрядное число. Например:
0 0001101 – положительное число
1 0001101 – отрицательное число
При этом в вычислительной технике прямой код используется почти исключительно для представления положительных чисел.
Для отрицательных чисел используется так называемый дополнительный код. Это связано с удобством выполнения операций над числами электронными устройствами компьютера.
Для перевода отрицательного числа в дополнительный код используется следующий алгоритм:
- Все разряды числа (кроме первого разряда) инвертируются, т.е. заменяются противоположными (0 на 1, а 1 на 0). Например, если 1 0001100 – это прямой код числа, то при формировании его дополнительного кода, сначала надо заменить нули на единицы, а единицы на нули, кроме первого разряда. Получаем 1 1110011.
- Далее следует прибавить единицу к получившемуся инверсией числу:
1 1110011 + 1 = 1 1110100
Презентацию с видео можно скачать на Patreon .
- Пробелы
- Идентификаторы
- Правила именования переменных
- Комментарии
- Разделители
- Ключевые слова
- Примитивные типы данных
- Тип данных char
- Типы byte, short, int, long
- Числа с плавающей точкой
- Тип данных boolean
- Литералы
- Методы
- Переменные
- Преобразование и приведение примитивных типов
- Ввод с клавиатуры
- Задания