Арифметические основы цифровых устройств
При выполнении различных операций в современных цифровых устройствах и системах числа обычно представляются в двоичной системе счисления. Это связано с тем, что для представления смысла символов цифр двоичной системы счисления можно использовать простые электронные схемы с двумя электрическими состояниями. Принято, что символ “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).
Принято считать, что дополнительный код положительного числа совпадает с его прямым кодом.
Операция вычитания с использованием только обратного кода (без дополнительных операций по переводу его в дополнительный код) приводит к ошибке, определяемой единицей в младшем разряде, и поэтому при точных расчетах не применяется.
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. у1,у0
Код 8 — 4 — 2 — 1 неудобен для выполнения арифметических операций, в частности из-за сложности обнаружения переноса в следующую тетроду при Хр + Yр > 10. При вычитании десятичных чисел X’ и Y’ дело обстоит еще сложнее – требуется вводить преобразователь кода 8 — 4 — 2 — 1 отрицательных чисел в дополнение до 9 (или до 10).
Десятичные сумматоры для сложения и вычитания чисел Х и Y можно построить на двоичных сумматорах, если использовать код с избытком 3. Код 8 — 4 — 2 — 1 для числа Хр + 3 называется кодом с избытком 3 числа Хр и обозначается через <Ар>. Для сложения 4-разрядных двоичных кодов <Хр> и
Рассмотрим особенности сложения положительных чисел Ар и Yр в коде с избытком 3. Если Хр + Yр > 10, то <Хр> +
Поэтому к остатку суммы
Если Хр + Yр < 10, то
Таким образом, если перенос возникает, то к остатку суммы следует прибавить число 3, а если он отсутствует, то к сумме следует прибавить число 13. Итак, одноразрядный десятичный сумматор для десятичных разрядов, представленных в коде с избытком 3, описывается соотношениями:

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

Прямой код числа кодирует только знаковую информацию и используется для хранения положительных и отрицательных чисел в ЭВМ. Прямой код двоичного числа совпадает по изображению с записью самого числа, но в знаковом разряде ставится 0, если число положительное и, 1 если число отрицательное.
Обратный и дополнительный коды используются для выполнения всех арифметических операций через операцию сложения.
Следует помнить, что положительные числа в обратном и дополнительном коде совпадают с прямым кодом.
1) Прямой код числа (кодируется только знаковая информация), “+”=0; ”-”=1.
Для прямого кода возможны два представления нуля, машинный положительный ноль, т.е. +0,110=0,110, машинный отрицательный ноль, т.е. -0,111=1,111.
Пример перевода
x1=10101-[x1]пр=010101
x2=-11101-[x2]пр=111101
x3=0,101-[x3]пр=0,101
x4=-0,111-[x4]пр=1,111
2) Обратный код числа, используется для выполнения арифметических операций вычитания, умножения, деления, через сложение. Обратный код положительного числа совпадает с его прямым кодом, обратный код отрицательного числа формируется по правилам: в знаковом разряде записывается “1”; цифровые значения меняются на противоположные.
3) Дополнительный код числа, имеет такое же назначение, как и обратный код числа. Формируется по следующим правилам: положительные числа в дополнительном коде выглядят также как и в обратном и в прямом коде, т.е. не изменяются. Отрицательные числа кодируются следующим образом: к обратному коду отрицательного числа (к младшему разряду) добавляется 1, по правилу двоичной арифметики.
Пример перевода
x1=10101-[x1]доп=010101
x2=-11101-[x2]обр=100010+1-[x2]доп=100011
x3=0,101-[x3]доп=0,101
x4=-0,111-[x4]обр=1,000+1-[x4]доп=1,001
Для выявления ошибок при выполнении арифметических операций используются также модифицированные коды: модифицированный прямой; модифицированный обратный; модифицированный дополнительный, для которых под код знака числа отводится два разряда, т.е. “+”=00; ”-”=11. Если в результате выполнения операции в знаковом разряде появляется комбинация 10 или 01 то для машины это признак ошибки, если 00 или 11 то результат верный.
Как определить, положительное или отрицательное число? Знак числа определяет старший бит: 0 — положительное число, 1 — отрицательное число. Например, для числа 1,001 сразу можно определить, что оно отрицательное (меньше нуля).
Прямой, дополнительный и обратный коды
Прямой, дополнительный и обратный код числа (создан по запросу).
Далее идет калькулятор, который переводит введенное положительное или отрицательное целое число в двоичный код, а также выводит обратный код этого числа и его дополнительный код. Под калькулятором, как водится, немного теории.
Обновление: Из комментариев становится ясно, что люди не вполне понимают, что делает этот калькулятор. Точнее, что делал — применял алгоритм вычисления дополнительного кода к любому числу. Люди хотят, чтобы он им просто показывал дополнительный код числа. Ну хорошо — теперь при вводе положительного числа калькулятор показывает представление числа в двоичной форме, ибо для него нет обратного и дополнительного кода, а при вводе отрицательного показывает дополнительный и обратный код.
Прямой, дополнительный и обратный код
Прямой код числа это представление беззнакового двоичного числа. Если речь идет о машинной арифметике, то как правило на представление числа отводится определенное ограниченное число разрядов. Диапазон чисел, который можно представить числом разрядов 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 двух бит переносов.
Вот благодаря таким удобным свойствам дополнительный код это самый распространенный способ представления отрицательных чисел в машинной арифметике.
