Как перевести из дополнительного кода в прямой

от admin

Арифметические основы цифровых устройств

При выполнении различных операций в современных цифровых устройствах и системах числа обычно представляются в двоичной системе счисления. Это связано с тем, что для представления смысла символов цифр двоичной системы счисления можно использовать простые электронные схемы с двумя электрическими состояниями. Принято, что символ “1” представляется некоторым стандартным уровнем напряжения или тока, а “0” — нулевым или близким к нулю уровнем напряжения или тока.

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

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

Операция вычитания в цифровых системах реализуется с помощью операции сложения. Вычитаемое при этом представляется в дополнительном коде (если расчет не требует высокой точности — в обратном коде).

Двоичный код со знаком называют также прямым кодом . В качестве примера рассмотрим положительное и отрицательное числа, десятичный эквивалент которых равен 46 10 :

0 0101110 — код положительного числа;

1 0101110 — код отрицательного числа.

Обратный код получается путем замены всех “0” на “1” и всех “1” на “0” прямого кода (двоичного числа со знаком). Причем, знаковый разряд при этом остается неизменным.

1 0101110 — прямой код отрицательного числа 4610;

1 1010001 — обратный код отрицательного числа 4610.

Замена “0” на единицу (“1”) называется инвертированием (также и замена “1” на “0”).

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

  • 1 0101110 — прямой код;
  • инвертирование всех разрядов кроме знакового;
  • 1 1010001 — обратный код
  • прибавляем 1 к младшему заряду;
  • 1 1010010 — дополнительный код.

Сложение и вычитание двоичных чисел

Правила сложения двух двоичных чисел можно показать на следующем примере:

1 + 1 = 0 и 1 переносится в старший разряд.

Пример. Требуется сложить два числа 18 10 и 23 10

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

Рассмотрим два примера, в первом требуется из числа 23 отнять число 18, а во втором из 18 отнять 23. С начала вычитающие представим в дополнительном коде:

11101110 — дополнительный код числа -18;

11101001 — дополнительный код числа -23.

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

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

10000100 — после инвертирования результата;

10000101 — после добавления 1.

В результате полученное число соответствует числу минус пять (-5).

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

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

Какой алгоритм перевода из доп кода в обратный и далее в прямой? Для двоичных чисел 8 бит

И начинаю переводить по тому же алгоритму (только в обратном порядке) для проверки и в итоге проверка получается вообще не понятная. Результат разности полученной суммы и одного из чисел в прямых кодах не совпадает с известным вторым числом. Как проверить то?

если число положительное то все так и оставлешь, если отрицательное то из дополнительного отнимаешь единицу => обратный код и инвертируешь все биты кроме бита знака => прямой код

И что не нравится?
-100011=-35, 10011=19
10011-100011=-10000=-16

1|1101111(ОК) = 1|0010000(ПК) = -16
1|1110000(ДК) = 1|1101111(ОК) = 1|0010000(ПК) = -16
Все сходится

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

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

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

Обновление: Из комментариев становится ясно, что люди не вполне понимают, что делает этот калькулятор. Точнее, что делал — применял алгоритм вычисления дополнительного кода к любому числу. Люди хотят, чтобы он им просто показывал дополнительный код числа. Ну хорошо — теперь при вводе положительного числа калькулятор показывает представление числа в двоичной форме, ибо для него нет обратного и дополнительного кода, а при вводе отрицательного показывает дополнительный и обратный код.

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

Прямой код числа это представление беззнакового двоичного числа. Если речь идет о машинной арифметике, то как правило на представление числа отводится определенное ограниченное число разрядов. Диапазон чисел, который можно представить числом разрядов 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 двух бит переносов.

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

6.4.3 Преобразователь дополнительного кода в прямой код

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

6.4.4 Преобразователь прямого кода в обратный код

Правило кодирования чисел:

Например, число А=0.10000 в обратном коде [A]обр=1.01111

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

Из сопоставления приведённых в таблице значений не трудно заключить, что:

Получаем схему, формирующую обратный код.

Рис. 6.20 Четырех разрядный преобразователь прямого кода в обратный код. Временные диаграммы

Рис. 6.21 Внутренняя структура элемента «Convert» (преобразователь прямого кода в обратный)

Рис. 6.22 Преобразователь прямого кода в обратный код в пакете MAX+Plus II

Рис. 6.23 Временные диаграммы преобразователя прямого кода в обратный

Рис. 6.24 Матрица временных задержек

6.4.5 Преобразователь обратного кода в прямой

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

6.4.6 Построение преобразователя двоичного кода в двоично-десятичный

Десятичные сумматоры применяются в тех случаях, когда числа X и Y представлены в десятичной системе счисления двоично-десятичным кодом 8-4-2-1 и требуется представлять сумму S в этом же коде. Числа X и Y записываются в виде:

Х’=хn. х1х0 Y’=yn. у10

Код 8 — 4 — 2 — 1 неудобен для выполнения арифметических операций, в частности из-за сложности обнару­жения переноса в следующую тетроду при Хр + Yр > 10. При вычитании десятичных чисел X’ и Y’ дело обстоит еще сложнее – требуется вводить преобразователь кода 8 — 4 — 2 — 1 отрицательных чисел в допол­нение до 9 (или до 10).

Десятичные сумматоры для сложения и вычитания чисел Х и Y можно построить на двоичных суммато­рах, если использовать код с избытком 3. Код 8 — 4 — 2 — 1 для числа Хр + 3 называется кодом с избытком 3 числа Хр и обозначается через <Ар>. Для сложения 4-разрядных двоичных кодов <Хр> и р> можно использовать 4-разрядные двоичные сумматоры.

Рассмотрим особенности сложения положительных чисел Ар и Yр в коде с избытком 3. Если Хр + Yр > 10, то <Хр> + р> = Хр + 3 + Yр + 3 > 16, и на выходе двоичного сумматора возникает перенос Сp+1= 1 в следующий десятичный разряд, а остаток суммы будет равен <Хр> + <Ур> — 16, в то время как он должен быть равен

Поэтому к остатку суммы p>+p>-16 следует прибавлять число 3.

Если Хр + Yр < 10, то p>+p><16 и на выходе двоичного сумматора перенос отсутствует (Cp+1 = 0), а сумма <Хр> + р> = <Хр + Yр> + 3. Поэтому из суммы <Хр> + р> следует вычесть число 3, чтобы получить величину <Хр + Yр>, которая является кодом с избытком 3 суммы Хр+Yр. Вычитание какого-либо числа эквивалентно сложению его с дополнением до 2 n , поэтому вместо вычитания числа 3 можно прибавить число 2 4 – 3 = 13 = 1101.

Таким образом, если перенос возникает, то к остатку суммы следует прибавить число 3, а если он от­сутствует, то к сумме следует прибавить число 13. Итак, одноразрядный десятичный сумматор для деся­тичных разрядов, представленных в коде с избытком 3, описывается соотношениями:

(6.6)

где Cp+1 — перенос в следующий десятичный разряд; p> значение р-го десятичного разряда суммы чисел X и Y; Ср = 0 или 1 – перенос из предыдущего десятичного разряда. Сложение с числами 3 и 13 называется коррекцией суммы. Из соотношения (6.6) видно, что вычисление суммы можно вы­полнить с помощью двух последовательно включенных 4-разрядных двоичных сумматоров: первый сумматор вычисляет вспомогательную сумму

и перенос Сp+1, а второй сумматор – сумму

Рассмотрим теперь вычитание n-разрядных десятичных чисел X и Y с использованием кода с избытком 3.

Так как S’=X-Y=X-10 n +(10 n -Y)= X-10 n +W , где W=10 n -Y,

То вычитание из X числа Y эквивалентно сложению X с дополнением Y до 10 n с коррекцией результата на 10 n .

При Х  5 надо производить сложение числа Х (x4, x4, x4 , x4) с числом 3. Таким образом, данный преобразователь выполняет функцию Y = X, если 0  Х  4 и Y = X + 3, если 5 Х9.

Похожие публикации