Как найти обратный код отрицательного числа

Двоичное число: прямой, обратный и дополнительный коды

Прямой код двоичного числа
Обратный код двоичного числа
Дополнительный код двоичного числа

Прямой, обратный и дополнительный коды двоичного числа — способы представления двоичных чисел с фиксированной запятой в компьютерной (микроконтроллерной) арифметике, предназначенные для записи отрицательных и неотрицательных чисел

Прямой, обратный и дополнительный код
Мы знаем, что десятичное число можно представить в двоичном виде. К примеру, десятичное число 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. Битовые операции


(39 голосов, оценка: 4,69 из 5)

Загрузка…


Тема 3: Представление
целых чисел в компьютере
.

Представление числовой информации в
компьютере

Любая информация (числа,
текстовая, графическая и т. д.) представляется
в ЭВМ в виде двоичных кодов фиксированной
или переменной длины. Отдельные элементы
двоичного кода, имеющие значение 0 или
1, называют битами.
Двоичный код состоящий из 8 разрядов
носит название байта.

Целые числа могут
представляться в компьютере со знаком
или без знака.

Представление целых чисел без знака
в компьютере

Целые числа без знака обычно  занимают
 в  памяти  компьютера  один,
два или 4 байта.    

В  однобайтовом  формате
 числа принимают  значения  от 
000000002  
до   111111112.

В двубайтовом формате —
от  00000000 000000002  
до   11111111 111111112.

В четырехбайтовом —  от
00000000 00000000 00000000 000000002
до 11111111 1111111 11111111 111111112

Диапазоны значений целых чисел без
знака

Формат
числа в байтах 

Диапазон 

Запись с
порядком

Обычная
запись

1

0 … 28–1

0 … 255

2

0 … 216–1

0 … 65535

4

0 … 232–1

0…429967295

Например,
в однобайтовом формате число 62=1111102
имеет вид:

В двубайтовом формате число 1402=101011110102
имеет вид:

Пример 1. Для хранения целого числа
без знака используется один

байт. Записать представление числа 19 в
компьютере.

1 шаг: Переведем число 19 из десятичной
системы счисления в двоичную.

2 шаг:
Так как для представления числа в
компьютере выделен 1 байт, то код числа
должен содержать 8 знаков (8 бит). Поэтому
впереди числа дописываем 3 незначащих
нуля.

0

0

0

1

0

0

1

1

Задания.

1. Запишите числа в беззнаковом коде
(формат 1 байт):

 а) 31;      б)
163;    в) 65;    г) 128. 

2. Найдите десятичные
представления чисел, записанных в
беззнаковом коде:

 а) 0 1011000;     
б) 1 0011011;     в) 0 1101001;     
г) 1 1000000. 

Представление целых чисел со знаком

Так же как беззнаковые целые числа целые
со знаком обычно  занимают  в
 памяти  компьютера  один, два
или 4 байта.

Диапазоны значений целых чисел со
знаком

Формат
числа в байтах

Диапазон

Запись с
порядком

Обычная
запись

1

–27 …
27–1 

–128 … 127 

2

–215 …
215–1 

–32768 …
32767

4

–231 …
231–1 

–2147483648 …
2147483647

Самый левый (старший бит)
разряд определяет знак числа. 
 Если
он равен 0, число положительное, если 1,
то отрицательное.

Например,
в однобайтовом формате число 46=1011102
имеет вид:

В ЭВМ в целях упрощения
выполнения арифметических операций
применяют специальные коды для
представления чисел. Использование
кодов позволяет свести операцию вычитания
чисел к арифметическому сложению кодов
этих чисел. Применяются прямой,
обратный
и дополнительный
коды чисел. Дополнительный код используется
для хранения чисел в запоминающем
устройстве ЭВМ. Обратный и дополнительный
коды используются для замены операции
вычитания операцией сложения, что
упрощает устройство арифметического
блока ЭВМ.

Прямой код.
Прямой код двоичного числа совпадает
по изображению с записью самого числа.
Значение знакового разряда для
положительных чисел равно 0, а для
отрицательных чисел 1.

Обратный код.
Обратный код для
положительного числа совпадает с прямым
кодом. Для отрицательного числа все
цифры числа заменяются на противоположные
(1 на 0, 0 на 1), а в знаковый разряд заносится
единица.

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

Например, в однобайтовом формате числа
27 и -27 имеют вид:

Число

Прямой
код

Обратный
код

Дополнительный
код

27

00011011

00011011

00011011

-27

10011011

11100100

11100101

Пример 1. Найти прямой, обратный и
дополнительный код представления числа
13 в однобайтном формате.

1 шаг: Переведем число 13 из десятичной
системы счисления в двоичную.

2 шаг: Для представления
числа в компьютере выделен 1 байт. Старший
бит занимает знак числа – 0. Сам код
числа должен занимать 7 бит. Таким образом
прямой код числа 13

0

0

0

0

1

1

0

1

Так как для положительных чисел прямой,
обратный и дополнительный код совпадает,
то ответ 00001101.

Пример 2. Найти прямой, обратный и
дополнительный код представления числа
-23 в однобайтовом формате.

1 шаг: Переведем число -23 из десятичной
системы счисления в двоичную. Получим

-2310=-101112

2 шаг: Прямой код числа в однобайтовом
формате, учитывая, что старший бит
занимает знак числа -1, имеет вид

1

0

0

1

0

1

1

1

3 шаг: Найдем обратный код числа -23,
заменив все цифры числа на
противоположные (1 на 0, 0 на 1), а в знаковый
разряд заносится единица. Имеем,

1

1

1

0

1

0

0

0

4 шаг: Найдем дополнительный код
числа -23, добавив 1 к младшему
разряду обратного кода.

1

1

1

0

1

0

0

1

Ответ:
прямой код – 10010111; обратный – 11101000;
дополнительный – 11101001.

Так
вот, прямой
обратный и дополнительный код — это
модели представления целых чисел
,
как положительных, так и отрицательных.
Примеры записи некоторых чисел во всех
трех восьмиразрядных кодах показаны в
таблице ниже.

Число

Прямой
код

Обратный
код

Дополнительный
код

0

00000000

00000000

00000000

1

00000001

00000001

00000001

-1

10000001

11111110

11111111

5

00000101

00000101

00000101

-5

10000101

11111010

11111011

8

00001000

00001000

00001000

-8

10001000

11110111

11111000

120

01111000

01111000

01111000

-120

11111000

10000111

10001000

127

01111111

01111111

01111111

-127

11111111

10000000

10000001

Во
всех трех кодах старший разряд указывает
на знак числа и он равен единице, если
число отрицательное и нулю в противном
случае. Остальные разряды содержат
представление модуля числа. Различие
между кодами наблюдается именно в
способах представления модуля. Для
положительного числа модуль во всех
трех кодах представляется одинаково —
это просто естественная запись двоичного
числа
.
Для отрицательных чисел, в обратном
коде это просто поразрядная инверсия
прямого кода, а в дополнительном — к
обратному коду, как к числу, просто
прибавляется единица.

Распространёнными
формами представления чисел со знаками
является их представление в прямом,
обратном и дополнительном коде.
Прямой
код числа образуется кодированием знака
числа нулём, если число положительно и
единицей, если число отрицательно (для
двоичной системы)
Для общего случая
(q — 1) — если число отрицательно, и 0 — если
число положительно. q — основание системы
счисления.
Код знака записывается
перед старшей цифрой числа и отделяется
от неё точкой:
-1.01 = 1.101
Прямой, обратный
и дополнительный коды положительных
чисел совпадают между собой.
Обратный
код отрицательного числа образуется
из прямого кода, заменой его цифр на их
дополнения до величины q-1. Код знака
сохраняется без изменения.
Пример
:
+12310 =
0.123пр =
0.123об.
-12310 =
9.123пр =
9.876об
+3А7С0016 =
0.3А7С00пр =
0.3А7С00об.
-3А7С0016 =
F.3А7С00пр=
F.C583FFоб.
-1012 =
1.101пр =
1.010об.
Замена
цифр их дополнениями для двоичной
системы совпадает с операцией инверсии,
то есть нули заменяются единицами,
единицы — нулями. Знак принимает значение,
равное единице.
Дополнительный код
отрицательного числа образуется из
обратного увеличением на 1 его младшего
разряда. При этом перенос из знакового
разряда игнорируется.
Пример:
+23610 =
0.236пр.=
0.236об.=
0.236доп.
-23610 =
9.236пр.=
9.763об.=
9.764доп.
-1012=
1.101пр.=
1.010об=
1.011доп.
-3А7С16=
F.3А7Спр=
F.C583об.=
F.C584доп.
Правила
перевода из прямого кода в обратный и
из обратного в прямой, а также из прямого
в дополнительный и из дополнительного
в прямой совпадают между собой.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

Машинные коды[править]

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

Различают следующие коды двоичных чисел:

  • прямой код (П),
  • обратный код (ОК),
  • дополнительный код (ДК).

Прямой код[править]

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

Пример.

А10 = +10; А2 = +1010; [А2]п = 0|1010

В10 = –15; В2 = –1111; [В2]п = 1|1111

Обратный код[править]

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

Пример.

А10 = +10; А2 = +1010; [А2]ок = [А2]п = 0|1010

В10 = –15; В2 = –1111; [В2]ок = 1|0000

Свое название обратный код получил потому, что коды цифр отрицательного числа заменены на инверсные. Наиболее важные свойства обратного кода чисел:

  • сложение положительного числа С с его отрицательным значением в обратном коде дает т.н. машинную единицу МЕок=1|11…11, состоящую из единиц в знаковом и в значащих разрядах числа;
  • нуль в обратном коде имеет двоякое значение. Он может быть как положительным числом – 0|00…00, так и отрицательным 1|11…11. Значение отрицательного числа совпадает с МЕок. Двойственное представление 0 явилось причиной того, что в современных ЭВМ все числа представляются не обратным, а дополнительным кодом.

Дополнительный код[править]

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

Пример.

А10 = +10; А2 = +1010; [А2]дк = [А2]ок = [А2]п = 0|1010

В10 = –15; В2 = –1111; [В2]дк = [В2]ок + 20 = 1|0000+1 = 1|0001

Основные свойства дополнительного кода:

• сложение дополнительных кодов положительного числа С с его отрицательным значением дает т.н. машинную единицу дополнительного кода:

МЕдк=МЕок + 20 = 10|00…00,

т.е. число 10 (два) в знаковых разрядах числа;

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

МЕдк.

Модифицированные обратные и дополнительные коды[править]

Модифицированные обратные и дополнительные коды двоичных чисел отличаются соответственно от обратных и дополнительных кодов удвоением значений знаковых разрядов. Знак «+» в этих кодах кодируется двумя нулевыми знаковыми разрядами, а знак «–» – двумя единичными разрядами.

Пример.

А10 = +10; А2 = +1010; [А2]дк = [А2]ок = [А2]п = 0|1010

2]мок = [А2]мдк = 00|1010

В10 = –15; В2 = –1111; [В2]дк= [В2]ок+20 = 1|0000+1 = 1|0001

2]мок= [В2]мдк= 11|0001

Целью введения модифицированных кодов являются фиксация и обнаружение случаев получения неправильного результата, когда значение результата превышает максимально возможный результат в отведенной разрядной сетке машины. В этом случае перенос из значащего разряда может исказить значение младшего знакового разряда. Значение знаковых разрядов «01» свидетельствует о положительном переполнении разрядной сетки, а «10» — об отрицательном переполнении. В настоящее время практически во всех компьютерах роль сдвоенных разрядов для фиксации переполнения разрядной сетки играют переносы, идущие в знаковый и из знакового разряда.

Арифметические действия в машинных кодах.[править]

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

Требуемая операция Необходимое преобразование
А+В А+В
А-В А+(-В)
-А+В (-А)+В
-А-В (-А)+(-В)

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

  1. Слагаемые должны иметь одинаковое число разрядов. Для выравнивания разрядной сетки слагаемых можно дописывать незначащие нули слева к целой части числа и незначащие нули справа к дробной части числа.
  2. Знаковые разряды участвуют в сложении так же, как и значащие.
  3. Необходимые преобразования кодов производятся с изменением знаков чисел. Приписанные незначащие нули изменяют свое значение при преобразованиях по общему правилу.
  4. При преобразовании единицы переноса из старшего знакового разряда, в случае использования ОК, эта единица складывается с младшим числовым разрядом. При использовании ДК единица переноса теряется. Знак результата формируется автоматически, результат представляется в том коде, в котором представлены исходные слагаемые.

Пример 1. Сложить два числа: А10 = 7, В10 = 16.

А2 = +111 = +0111; В2 = +10000.

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

[A2]п = [A2]ок = [A2]дк = 0|00111; [В2]п = [В2]ок = [В2]дк = 0|10000.

Сложение в обратном или дополнительном коде дает один и тот же результат:

0|00111

+0|10000

———-

С2 = 0|10111

С10 = +23

Пример 2. Сложить два числа: А10 = +16, В10 = -7 в ОК и ДК.

По таблице необходимо преобразование А+(-В), в которой второй член преобразуется с учетом знака

[A2]п = [A2]ок = [A2]дк = 0|10000;

2]п = 1|111 = 1|00111; [В2]ок = 1|11000; [В2]дк = 1|11001

При сложении чисел в ОК и ДК были получены переносы в знаковый разряд и из знакового разряда. В случае ОК перенос из знакового разряда требует дополнительного прибавления единицы младшего разряда (п.4 правил). В случае ДК этот перенос игнорируется.

Практическая часть.[править]

Задание:

  1. Взять две пары десятичных двузначных целых числа: А, В, С, D. (Варианты по списку)
  2. Вычислить (А-В)ок, (В-А)дк, (С-D)ок, (D-C)дк.

Варианты

  1. Вариант — 78, 56, 11, 35;
  2. Вариант — 67, 36, 45, 22;
  3. Вариант — 21, 87, 38, 44;
  4. Вариант — 99, 26, -73, 26,
  5. Вариант — 28, 33, 42, 54;
  6. Вариант — 61, 43, 65, 41;
  7. Вариант — 11, 84, 49, 53;
  8. Вариант — 85,- 47, 43, 66;
  9. Вариант — 48, 52, 65, 88;
  10. Вариант — 26, 58, 63, 77;
  11. Вариант — 91, 22, 46, -14;
  12. Вариант — 57, 14, 69, 55;
  13. Вариант — 77, 98, 25, -88;
  14. Вариант — 46, 66, 35, 36;
  15. Вариант — 44, 37, 92, 28;
  16. Вариант — 63, 46, 83, 71;
  17. Вариант — 35, -51, 63, 24;
  18. Вариант — 25, 95, -38, 33;
  19. Вариант — 32, 29, 86, 27;
  20. Вариант — 49, 55, -73, 22
  21. Вариант — 33, -77, 53, 71;
  22. Вариант — 48, 86, 62, 42;
  23. Вариант — 69, -48, 11, 20;
  24. Вариант — 10; 82, 80, 45;
  25. Вариант — 70, 93, -27, 30;
  26. Вариант — 88, -40, 16, 83;
  27. Вариант — 64, 80, -17, 77;
  28. Вариант — 40, 46, -73, 19;
  29. Вариант — 14, -60, 11, 27;
  30. Вариант — 90, 73, -10, 20.
 

Очень часто в вычислениях должны использоваться не только положительные, но и отрицательные числа.
Число со знаком в вычислительной технике представляется путем представления старшего разряда числа в качестве знакового. Принято считать, что 0 в знаковом разряде означает знак «плюс» для данного числа, а 1 – знак «минус».
Знаковые числа
Выполнение арифметических операций над числами с разными знаками представляется для аппаратной части довольно сложной процедурой. В этом случае нужно определить большее по модулю число, произвести вычитание и присвоить разности знак большего по модулю числа.
Применение дополнительного кода позволяет выполнить операцию алгебраического суммирования и вычитания на обычном сумматоре. При этом не требуется определения модуля и знака числа.
Прямой код представляет собой одинаковое представление значимой части числа для положительных и отрицательных чисел и отличается только знаковым битом. В прямом коде число 0 имеет два представления «+0» и «–0».
Обратный код для положительных чисел имеет тот же вид, что и прямой код, а для отрицательных чисел образуется из прямого кода положительного числа путем инвертирования всех значащих разрядов прямого кода. В обратном коде число 0 также имеет два представления «+0» и «–0».
Дополнительный код для положительных чисел имеет тот же вид, что и прямой код, а для отрицательных чисел образуется путем прибавления 1 к обратному коду. Добавление 1 к обратному коду числа 0 дает единое представление числа 0 в дополнительном коде. Однако это приводит к асимметрии диапазонов представления чисел относительно нуля. Так, в восьмиразрядном представлении диапазон изменения чисел с учетом знака.

-128 <= x <= 127.

Таблица прямого, обратного и дополнительного кода 4-битных чисел.

Число Прямой код Обратный код Дополнительный код
-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
00 10000000 11110000 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
Сложение и вычитание чисел со знаком в дополнительном коде

Если оба числа имеют n–разрядное представление, то алгебраическая сумма будет получена по правилам двоичного сложения (включая знаковый разряд), если отбросить возможный перенос из старшего разряда. Если числа принадлежат диапазону представимых данных и имеют разные знаки, то сумма всегда будет лежать в этом диапазоне. Переполнение может иметь место, если оба cлагаемых имеют одинаковые знаки.
Пример 1: 6 – 4 = ?
6 – положительное число с кодом 0110
–4 – отрицательное число с дополнительным кодом 1100

Дополнительный код(перенос игнорируется): 6 – 4 = 2.
Пример 2: –5 + 2 = ?
2 – положительное число с кодом 0010
–5 – отрицательное число с дополнительным кодом 1011

Дополнительный кодЧисло с кодом 1101 является отрицательным, модуль этого числа имеет код 00112 = 310.

Назад: Представление данных и архитектура ЭВМ

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

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

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

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

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

Представление положительного числа

Итак, теория

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

Примеры где показаны переносы и пятый разряд

7+1=8

00111 прямой код 7
00001 прямой код 1
01110 переносы
01000 результат 8 — переполнение

Два последних переноса 01 — переполнение

-7+7=0
00111 прямой код 7
01001 дополнительный код 7
11110 переносы
10000 результат 16 — но пятый разряд можно игнорировать, реальный результат 0

Два последних переноса 11 з перенос в пятый разряд можно отбросить, оставшийся результат, ноль, арифметически корректен.
Опять же проверять на переполнение можно простейшей операцией XOR двух бит переносов.

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

P.S. Ну а обратный код дополняет число до 2^n-1, или до всех 1, потому и называется дополнением до 1. Им тоже можно представлять отрицательные числа, и реализовать вычитание и сложение схемой сложения, только сложение там хитрее — с циклическим переносом, ну и представить можно меньше на одно число, так как все единицы уже заняты — это обратный код нуля, эдакий «минус нуль», то есть диапазон получается, если брать наш пример от -7 до 7. Не так удобно, одним словом.

Понравилась статья? Поделить с друзьями:
  • Как исправить ошибку bsod
  • Как составить реце
  • Как найти высоту прямоугольного треугольника зная основание
  • Как исправить выгоревшую ткань
  • Как найти запятую между частями сложного предложения