дополнительный код two s complement

Дополнительный код (дополнение до двух)

Чаще всего для представления отрицательных чисел используется код с дополнением до двух (англ. two’s complement). Он же называется обратный дополнительный код.

Алгоритм получения дополнительного кода числа:

если число положительное, то в старший разряд записывается ноль, далее записывается само число;

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

Рис. 4. Нумерация двоичных чисел в представлении c дополнением до двух.

дополнительный код two s complementВ качестве примера переведём число −5 в дополнительный восьмибитовый код. Прямой код модуля −5 — 0000101, обратный — 1111010, прибавляем 1, получаем 1111011, приписываем 1 в качестве знакового разряда, в результате получаем 11111011.

Также дополнительный код отрицательного числа дополнительный код two s complement, хранящегося в дополнительный код two s complementбитах, равен дополнительный код two s complement. По сути, дополнительный код представляет собой дополнение дополнительный код two s complementдо дополнительный код two s complement: так как в дополнительный код two s complement-разрядной арифметике дополнительный код two s complement(двоичная запись этого числа состоит из единицы и дополнительный код two s complementнулей, а в дополнительный код two s complement-разрядную ячейку помещаются только дополнительный код two s complementмладших разрядов, то есть дополнительный код two s complementнулей), то верно равенство дополнительный код two s complement.

Для получения из дополнительного кода самого числа нужно инвертировать все разряды кода и прибавить к нему единицу. Можно проверить правильность, сложив дополнительный код с самим числом: результат должен быть равен дополнительный код two s complement. Переведём 11111011 обратно. Инвертируем — 00000100, прибавляем 1, получаем 00000101 — модуль исходного числа −5. Проверим: 11111011 + 00000101 = 100000000.

Можно получить диапазон значений дополнительный код two s complement.

Достоинства метода:

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

· нет проблемы двух нулей.

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

Арифметические действия над целыми числами

Обратный и дополнительный коды применяются особенно широко, так как они позволяют упростить конструкцию арифметико-логического устройства (АЛУ) компьютера путем замены некоторых арифметических операций сложением.

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

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

Сложение и вычитание чисел без знака происходит по обычным для позиционных систем счисления алгоритмам.

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

дополнительный код two s complement

дополнительный код two s complement

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

дополнительный код two s complement

дополнительный код two s complement

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим.

Источник

Дополнительный код (представление числа)

Дополнительный код (дополнение до 2) двоичного числа получается добавлением 1 к младшему значащему разряду его дополнения до 1. [1]

Дополнение до 2 двоичного числа определяется как величина полученная вычитанием числа из наибольшей степени двух (из 2 N для N-битного дополнения до 2). [2]

Содержание

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

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

Десятичное
представление
Код двоичного представления (8 бит)
прямойдополнительный
1270111111101111111
10000000100000001
00000000000000000
-010000000———
-11000000111111111
-21000001011111110
-31000001111111101
-41000010011111100
-51000010111111011
-61000011011111010
-71000011111111001
-81000100011111000
-91000100111110111
-101000101011110110
-111000101111110101
-1271111111110000001
-128———10000000

При применении той же идеи к привычной 10-ричной системе счисления получится (например, для гипотетического процессора использующего 10-ричную систему счисления):

10-ричная система счисления
(«обычная» запись)
10-ричная система счисления,
дополнительный код
..
130013
120012
110011
100010
90009
80008
..
20002
10001
00000
-19999
-29998
-39997
-49996
..
-99991
-109990
-119989
-129988
..

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

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

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

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

Добавим к результату 1

Допишем слева знаковый единичный разряд

Для обратного преобразования используется тот же алгоритм. А именно:

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

Добавим к результату 1 и проверим, сложив с дополнительным кодом

Дополнительный код для десятичных чисел

Тот же принцип можно использовать и в компьютерном представлении десятичных чисел: для каждого разряда цифра X заменяется на 9−X, и к получившемуся числу добавляется 1. Например, при использовании четырёхзначных чисел −0081 заменяется на 9919 (9919+0081=0000, пятый разряд выбрасывается).

Источник

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

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

дополнительный код two s complement
Мы знаем, что десятичное число можно представить в двоичном виде. К примеру, десятичное число 100 в двоичном виде будет равно 1100100, или в восьмибитном представлении 0110 0100. А как представить отрицательное десятичное число в двоичном виде и произвести с ним арифметические операции? Для этого и предназначены разные способы представления чисел в двоичном коде.
Сразу отмечу, что положительные числа в двоичном коде вне зависимости от способа представления (прямой, обратный или дополнительный коды) имеют одинаковый вид.

Прямой код

дополнительный код two s complement

Обратный код

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

дополнительный код two s complement

Арифметические операции с отрицательными числами в обратном коде:

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

В дополнительном коде (как и в прямом и обратном) старший разряд отводится для представления знака числа (знаковый бит).

дополнительный код two s complement

дополнительный код two s complement

Арифметические операции с отрицательными числами в дополнительном коде

Вывод:
1. Для арифметических операций сложения и вычитания положительных двоичных чисел наиболее подходит применение прямого кода
2. Для арифметических операций сложения и вычитания отрицательных двоичных чисел наиболее подходит применение дополнительного кода

дополнительный код two s complementдополнительный код two s complementдополнительный код two s complementдополнительный код two s complement дополнительный код two s complement(34 голосов, оценка: 4,68 из 5)

Источник

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

Десятичное
значение
Дополнительный код комплемент
представление
0000
1001
2010
3011
−4100
−3101
−2110
−1111
Восьмибитовые целые числа со знаком

Десятичное
значение
Дополнительный код комплемент
представление
00000 0000
10000 0001
20000 0010
1260111 1110
1270111 1111
−1281000 0000
−1271000 0001
−1261000 0010
−21111 1110
−11111 1111

СОДЕРЖАНИЕ

История

Преобразование из представления дополнения до двух

Преобразование в представление дополнения до двух

Из дополнения

Чтобы получить двойное дополнение отрицательного двоичного числа, биты инвертируются или «переворачиваются» с помощью побитовой операции НЕ ; значение 1 затем добавляется к результирующему значению, игнорируя переполнение, которое происходит при взятии дополнения до двух, равного 0.

Например, используя 1 байт (= 8 бит), десятичное число 5 представлено как

Самый старший бит равен 0, поэтому шаблон представляет неотрицательное значение. Чтобы преобразовать в −5 в нотации с дополнением до двух, сначала биты инвертируются, то есть: 0 становится 1, а 1 становится 0:

Дополнение до двух отрицательного числа является соответствующим положительным значением, за исключением одного особого случая. Например, инвертирование битов −5 (см. Выше) дает:

И добавление единицы дает окончательное значение:

Аналогично, два дополнения нуля равны нулю: инвертирование дает все единицы, а добавление единицы изменяет единицы обратно на нули (поскольку переполнение игнорируется).

Дополнение до двух наиболее отрицательного числа, которое может быть представлено (например, единица в качестве самого старшего бита, а все остальные биты равны нулю), является самим собой. Следовательно, существует «лишнее» отрицательное число, для которого дополнение до двух не дает отрицания, см. § Наиболее отрицательное число ниже.

Вычитание из 2 Н

Например, чтобы найти 4-битное представление −5 (нижние индексы обозначают основание представления ):

Следовательно, при N = 4 :

Расчет может быть выполнен полностью по базе 10, преобразовав в конце в базу 2:

Работа от LSB к MSB

В компьютерных схемах этот метод не быстрее, чем метод «дополнить и добавить один»; оба метода требуют последовательной работы справа налево, распространяя логические изменения. Метод дополнения и добавления единицы может быть ускорен стандартной схемой сумматора с упреждающим переносом ; переход от LSB к MSB может быть ускорен аналогичным логическим преобразованием.

Расширение знака

Повторение знаковых битов в 7- и 8-битных целых числах с использованием дополнения до двух

Десятичный7-битная запись8-битная запись
-4210101101101 0110
4201010100010 1010

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

Как сдвиг, так и удвоение точности важны для некоторых алгоритмов умножения. Обратите внимание, что, в отличие от сложения и вычитания, расширение ширины и сдвиг вправо для чисел со знаком и без знака выполняются по-разному.

Самое отрицательное число

За одним исключением, начиная с любого числа в представлении с дополнением до двух, если все биты перевернуты и добавлен 1, получается представление с дополнением до двух отрицательного числа этого числа. Положительный 12 становится отрицательным 12, положительный 5 становится отрицательным 5, ноль становится нулем (+ переполнение) и т. Д.

Дополнение до двух до −128 дает одно и то же 8-битное двоичное число.

−1281000 0000
инвертировать биты0111 1111
добавить один1000 0000

Дополнение до двух минимального числа в диапазоне не приведет к желаемому эффекту отрицания числа. Например, дополнительное двоичное значение −128 в 8-битной системе равно −128. Хотя ожидаемый результат от отрицания −128 равен +128, не существует представления +128 с помощью 8-битной системы дополнения до двух, и поэтому фактически невозможно представить отрицание. Обратите внимание, что два дополнения, являющиеся одним и тем же числом, обнаруживаются как условие переполнения, поскольку произошел перенос в самый старший бит, но не из него.

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

В языках программирования C и C ++ вышеуказанное поведение не определено, и они не только могут возвращать странные результаты, но и компилятор может предположить, что программист обеспечил невозможность выполнения неопределенных вычислений, и сделать выводы из этого предположения. Это позволяет проводить ряд оптимизаций, но также приводит к ряду странных ошибок в таких неопределенных программах.

Самое отрицательное число в дополнении до двух иногда называют «странным числом», потому что это единственное исключение. Хотя число является исключением, это действительное число в обычных системах с дополнением до двух. Все арифметические операции работают с ним и как операнд, и как результат (если не было переполнения).

Почему это работает

Например, с восемью битами байты без знака составляют от 0 до 255. Вычитание 256 из верхней половины (от 128 до 255) дает байты со знаком от –128 до –1.

Некоторые особые числа на заметку

ДесятичныйДвоичный
1270111 1111
640100 0000
10000 0001
00000 0000
−11111 1111
−641100 0000
−1271000 0001
−1281000 0000

Пример

Система полезна для упрощения выполнения арифметических операций на компьютерном оборудовании. Добавление 0011 (3.) к 1111 (-1.) Сначала кажется неправильным ответом 10010. Однако оборудование может просто игнорировать самый левый бит, чтобы дать правильный ответ 0010 (2.). По-прежнему должны существовать проверки переполнения, чтобы перехватить такие операции, как суммирование 0100 и 0100.

Таким образом, система позволяет добавлять отрицательные операнды без схемы вычитания или схемы, определяющей знак числа. Более того, эта схема сложения также может выполнять вычитание, взяв дополнение числа до двух (см. Ниже), для чего требуется только дополнительный цикл или собственная схема сумматора. Для этого схема просто работает так, как если бы был крайний левый дополнительный бит 1.

Арифметические операции

Добавление

Добавление чисел в дополнительном коде не требует специальной обработки, даже если операнды имеют противоположные знаки: знак результата определяется автоматически. Например, сложив 15 и −5:

Или вычисление 5-15 = 5 + (−15):

Другими словами, если два левых бита переноса (те, которые находятся в крайнем левом верхнем ряду в этих примерах) равны 1 или оба 0, результат действителен; если два левых бита переноса равны «1 0» или «0 1», произошло переполнение знака. Удобно, что операция XOR над этими двумя битами может быстро определить, существует ли условие переполнения. В качестве примера рассмотрим 4-битное сложение чисел 7 и 3 со знаком:

Вычитание

Компьютеры обычно используют метод дополнений для выполнения вычитания. Использование дополнений для вычитания тесно связано с использованием дополнений для представления отрицательных чисел, поскольку комбинация допускает все знаки операндов и результатов; прямое вычитание работает и с числами с дополнением до двух. Как и в случае сложения, преимущество использования дополнения до двух состоит в том, что исключается проверка знаков операндов для определения необходимости сложения или вычитания. Например, вычитание −5 из 15 на самом деле добавляет 5 к 15, но это скрыто представлением с дополнением до двух:

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

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

Умножение

Сравнение (заказ)

Дополнение до двух и 2-адические числа

В классическом HAKMEM, опубликованном лабораторией искусственного интеллекта Массачусетского технологического института в 1972 году, Билл Госпер отметил, что было ли внутреннее представление машины дополнением до двух, можно определить путем суммирования последовательных степеней двойки. В полете фантазии он заметил, что результат выполнения этого алгебраически указывает на то, что «алгебра запускается на машине (вселенной), которая является дополнением до двух».

Преобразование дроби

Например, имея плавающее значение 0,0110 для работы этого метода, не следует рассматривать последний 0 справа. Следовательно, вместо того, чтобы вычислять десятичное значение для 0110, мы вычисляем значение 011, которое равно 3 в десятичной системе (если оставить 0 в конце, результатом будет 6 вместе со знаменателем 2 4 = 16, что сокращается до 3/8). Знаменатель равен 8, что дает окончательный результат 3/8.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *