Для получения дополнительного k-разрядного кода отрицательного числа необходимо следующее:
1. Модуль числа представить прямым кодом в k двоичных разрядах.
2. Значения всех бит инвертировать (все нули заменяются на единицы, а единицы на нули), таким образом получается k-разрядный обратный код исходного числа.
3. К полученному обратному коду, трактуемому как k-разрядное неотрицательное двоичное число, прибавить единицу.
Заметим, что получение дополнительного кода одного и того же отрицательного числа для типов разной разрядности на основе ранее полученного дополнительного кода сводится к удалению или добавлению левых дополнительных разрядов, заполненных единицами.
1.
2.
3.
тема 1 вопрос 15
алгоритмы получения прямого обратного и дополнительного кода числа. примеры.
1.2.1. Алгоритм получения дополнительного кода
Для получения дополнительного kразрядного кода отрицательного числа необходимо следующее:
Модуль числа представить прямым кодом в k двоичных разрядах.
Значения всех бит инвертировать (все нули заменяются на единицы, а единицы на
нули), таким образом получается kразрядный обратный код исходного числа.
К полученному обратному коду, трактуемому как kразрядное неотрицательное
двоичное число, прибавить единицу.
Заметим, что получение дополнительного кода одного и того же отрицательного числа для типов
разной разрядности на основе ранее полученного дополнительного кода сводится к удалению или
добавлению левых дополнительных разрядов, заполненных единицами.
При представлении отрицательного числа m дополнительным кодом в самом левом (знаковом) бите
записывается знак отрицательного числа (единица), а в остальных разрядах записывается число 2k1 |
m|. Если это число рассматривать как положительное, то максимальное по модулю отрицательное
число, которое можно представить в k разрядах, равно 2k1.
Описанный выше алгоритм получения дополнительного кода для отрицательного числа знаковую
единицу в левом разряде образует автоматически при |m| ≤ 2k1. Если же 2k1 < |m| < 2k, то попытка
реализации данного алгоритма приведет к тому, что в левом разряде будет находиться цифра 0. Это
соответствует компьютерному представлению положительных чисел, что неверно. Именно поэтому в
определении дополнительного кода на значение наложено ограничение.
Для полноты рассмотрения получим дополнительно 8разрядный код для чисел 128 (минимальное
представимое число), 127 (число, обратное максимально представимому) и 0.
Число
Прямой код модуля
Обратный код
Дополнительный код
0
127
128
10 000 000 01 111 111 00 000 000
01 111 111 10 000 000 11 111 111
10 000 000 10 000 001 00 000 000
Отметим, что для числа 128 прямой код совпадает с дополнительным, а дополнительный код числа
0 совпадает с обычным нулем. Однако при преобразовании обратного кода для числа 0 в его
дополнительный код правила обычной двоичной арифметики оказываются нарушенными, а именно:
1111 11112 +1 = 1 0000 00002 = 2k
Но, поскольку описанные действия производятся в k двоичных разрядах, левая единица результата
оказывается лишней и игнорируется.
Отметим еще раз, что в kразрядной целочисленной компьютерной арифметике 2k = 0.
Прямой, обратный и дополнительный коды
Главная > Представление данных и архитектура ЭВМ > Прямой, обратный и дополнительный коды
Очень часто в вычислениях должны использоваться не только положительные, но и отрицательные
числа.
Число со знаком в вычислительной технике представляется путем представления старшего разряда
числа в качестве знакового. Принято считать, что 0 в знаковом разряде означает знак «плюс» для
данного числа, а 1 – знак «минус».
Выполнение арифметических операций над числами с разными знаками представляется дляаппаратной части довольно сложной процедурой. В этом случае нужно определить большее по
модулю число, произвести вычитание и присвоить разности знак большего по модулю числа.
Применение дополнительного кода позволяет выполнить операцию алгебраического суммирования и
вычитания на обычном сумматоре. При этом не требуется определения модуля и знака числа.
Прямой код представляет собой одинаковое представление значимой части числа для
положительных и отрицательных чисел и отличается только знаковым битом. В прямом коде число 0
имеет два представления «+0» и «–0».
Обратный код для положительных чисел имеет тот же вид, что и прямой код, а для отрицательных
чисел образуется из прямого кода положительного числа путем инвертирования всех значащих
разрядов прямого кода. В обратном коде число 0 также имеет два представления «+0» и «–0».
Дополнительный код для положительных чисел имеет тот же вид, что и прямой код, а для
отрицательных чисел образуется путем прибавления 1 к обратному коду. Добавление 1 к обратному
коду числа 0 дает единое представление числа 0 в дополнительном коде. Однако это приводит к
асимметрии диапазонов представления чисел относительно нуля. Так, в восьмиразрядном
представлении диапазон изменения чисел с учетом знака.
Таблица прямого, обратного и дополнительного кода 4битных чисел.
128 <= x <= 127.
Число Прямой код Обратный код Дополнительный код
8
7
6
5
4
3
2
1
1111
1110
1101
1100
1011
1010
1001
1000
1001
1010
1011
1100
1101
1110
00
10000000
11110000
1
2
3
4
5
6
7
0001
0010
0011
0100
0101
0110
0111
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
0000
0001
0010
0011
0100
0101
0110
0111
Сложение и вычитание чисел со знаком в дополнительном коде
Если оба числа имеют n–разрядное представление, то алгебраическая сумма будет получена по
правилам двоичного сложения (включая знаковый разряд), если отбросить возможный перенос из
старшего разряда. Если числа принадлежат диапазону представимых данных и имеют разные знаки, тосумма всегда будет лежать в этом диапазоне. Переполнение может иметь место, если оба cлагаемых
имеют одинаковые знаки.
Пример 1: 6 – 4 = ?
6 – положительное число с кодом 0110
–4 – отрицательное число с дополнительным кодом 1100
(перенос игнорируется): 6 – 4 = 2.
Пример 2: –5 + 2 = ?
2 – положительное число с кодом 0010
–5 – отрицательное число с дополнительным кодом 1011
Число с кодом 1101 является отрицательным, модуль этого числа имеет код 00112 =
310.
Как получить дополнительный код?
Давайте посмотрим, как получается дополнительный код для двоичной системы счисления.
Вначале зададимся разрядностью регистра, в котором будет храниться наше число. Пусть,
для примера, мы будем работать с 8ми разрядными числами. Возьмем, опять же для
примера, число двенадцать и запишем его в двоичной системе счисления: 1100. Теперь
впишем его в 8ми разрядный регистр, где старшие, незадействованные в числе, разряды
имеют нулевое значение (нумерация разрядов начинается с нуля).
Разр. 7 6 5 4 3 2 1 0
12 0 0 0 0 1 1 0 0
Такая запись соответствует 8ми разрядному прямому коду числа двенадцать. А теперь
проинвертируем все разряды регистра, т.е. заменим 0 на 1 и 1 на 0. и получим обратный
код.
Разр.7 6 5 4 3 2 1 0
12обр 1 1 1 1 0 0 1 1
Прибавив к числу в обратном коде единицу, получаем искомый дополнительный код.
(красным цветом показаны переносы в соответствующий разряд)
Разр.c 7 6 5 4 3 2 1 0
1 1
12обр 1 1 1 1 0 0 1 1
+
1
12доп 1 1 1 1 0 1 0 0
Попробуем выполнить операцию вычитания нашего числа (двенадцать) из двадцати девяти
с помощью сложения. Для этого впишем двоичное представление числа двадцать девять в8ми разрядный регистр и прибавим к нему дополнительный код, полученный ранее из
числа двенадцать. Возникающий при этом перенос из самого старшего разряда игнорируем.
Разр.c 7 6 5 4 3 2 1 0
1 1 1 1 1 1
29 0 0 0 1 1 1 0 1
12доп 1 1 1 1 0 1 0 0
17 0 0 0 1 0 0 0 1
Мы видим, что результирующая сумма есть двоичное число семнадцать и это
действительно соответствует разности чисел двадцать девять и двенадцать.
Прямой код
Нумерация двоичных чисел в прямом представлении
При записи числа в прямом коде (англ. signandmagnitude method) старший разряд
является знаковым разрядом. Если его значение равно нулю, то число положительное, если
единице — отрицательное. В остальных разрядах (которые называются цифровыми)
записывается двоичное представление модуля числа. Например, число
типе данных, использующем прямой код, будет выглядеть так:
Таким способом в
битовом типе данных можно представить диапазон чисел
в восьмибитном
.
.
Достоинства метода:
получить прямой код числа достаточно просто.
Недостатки:
выполнение арифметических операций с отрицательными числами требует
усложнения архитектуры центрального процессора (например, для вычитания
невозможно использовать сумматор, необходима отдельная схема для этого);
существуют два нуля
, изза чего усложняется арифметическое сравнение.
и
Изза этого прямой код используется очень редко.
рямой код числа это представление беззнакового двоичного числа. Если речь идет
о машинной арифметике, то как правило на представление числа отводится определенное
ограниченное число разрядов. Диапазон чисел, который можно представить числом
разрядов n равен
Обратный код числа, или дополнение до единицы (one’s complement) это
инвертирование прямого кода (поэтому его еще называют инверсный код). То есть все
нули заменяются на единицы, а единицы на нули.