Главная Случайная страница


Полезное:

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


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Дополнительный код. Назначение. Порядок перевода в дополнительный код





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

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

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

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

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

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

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

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

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

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

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

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

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

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

0101 + 1011 = 10000, пятый разряд выбрасывается.

p-адические числа

В системе p-адических чисел изменение знака числа осуществляется преобразованием числа в егодополнительный код. Например, если используется 5-ричная система счисления, то число, противоположное1000... (1) равно 4444.... (−1).

Реализация алгоритма преобразования в обратный код (для 8-битныхчисел)

Pascal

if a<0

then a:=((not a) or 128) + 1;

C/C++

if (a < 0)

a = ((~(-a))|128) + 1;

Преимущества и недостатки

Преимущества

● Один и тот же регистр может хранить как n-битовое положительное число, так и (n−1)-битовое число сознаком, с общими для обоих форматов операциями сложения, вычитания и левого сдвига.

● Более удобная упаковка чисел в битовые поля.

● Отсутствие числа «минус ноль».

Недостатки

● Дополнительный код не очевиден для новичков.

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

● Модуль наибольшего числа не равен модулю наименьшего числа. Пример: знаковое целое 8-битовое.Максимальное число: 12710 == 7F16 == 011111112. Минимальное число: -12810 == 8016,дополнительный код ==100000002,дополнительный код. Соответственно, не для любого числа существует противоположное. Операцияизменения знака может потребовать дополнительной проверки.

● Сравнение. В отличие от сложения, числа в дополнительном коде нельзя сравнивать, как беззнаковые, иливычитать без расширения разрядности. Один из методов состоит в сравнении как беззнаковые исходныхчисел с инвертированным знаковым битом.

Пример программного преобразования

Если происходит чтение данных из файла или области памяти, где они хранятся в двоичном дополнительном коде (например, файл WAVE), может оказаться необходимым преобразовать байты. Если данные хранятся в 8 битах, необходимо, чтобы значения 128-255 были отрицательными.

C#.NET / C style

byte b1 = 254; //11111110 (бинарное)

byte b2 = 121; //01111001 (бинарное)

byte c = 1<<(sizeof(byte)*8-1); //2 возводится в степень 7. Результат: 10000000 (бинарное)

byte b1Conversion=(c ^ b1) - c; //Результат: -2. А фактически, двоичный дополнительный код.

byte b2Conversion=(c ^ b2) - c; //Результат остаётся 121, потому что знаковый разряд - нуль.

 

● Преобразование прямого кода в дополнительный (дополнение числа до 2n) реализуется сложнее. В этом случае операция преобразования не является поразрядной, и для определения значения кода в каком-либо разряде требуется анализ значений других разрядов. Для получения дополнительного кода нужно проинвертировать все разряды преобразуемого кода и затем прибавить к результату единицу (рисунок 3.1, б).

● Сопоставление прямого и дополнительного кодов показывает, что последний отличается от первого инвертированием старших разрядов от n-1 до i+l включительно, где i – номер первого справа разряда, содержащего единицу. Остальные разряды остаются неизменными. Например, для прямого кода 10100100 дополнительным будет код 01011100. Аналитически это правило записывается в виде:

● согласно чему для получения i-гo разряда дополнительного кода нужно сложить по модулю 2 исходный код этого разряда с дизъюнкцией всех предыдущих (младших) разрядов. Знаковый разряд преобразуемого кода может использоваться как управляющий сигнал (рисунок 3.1, б).

● С ростом объемов постоянных запоминающих устройств стало рациональным выполнять преобразователи кодов на основе памяти (табличным методом). Таблица преобразования двоично-десятичных кодов в двоичные в пределах полутора тетрад, не включающая младших разрядов, одинаковых для обоих кодов, имеет следующий вид:

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

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

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

Преимущества

● Один и тот же регистр может хранить как n-битовое положительное число, так и (n−1)-битовое число сознаком, с общими для обоих форматов операциями сложения, вычитания и левого сдвига.

● Более удобная упаковка чисел в битовые поля.

● Отсутствие числа «минус ноль».

Недостатки

● Дополнительный код не очевиден для новичков.

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

● Модуль наибольшего числа не равен модулю наименьшего числа. Пример: знаковое целое 8-битовое.Максимальное число: 12710 == 7F16 == 011111112. Минимальное число: -12810 == 8016,дополнительный код ==100000002,дополнительный код. Соответственно, не для любого числа существует противоположное. Операцияизменения знака может потребовать дополнительной проверки.

● Сравнение. В отличие от сложения, числа в дополнительном коде нельзя сравнивать, как беззнаковые, иливычитать без расширения разрядности. Один из методов состоит в сравнении как беззнаковые исходныхчисел с инвертированным знаковым битом.

 

Date: 2016-06-06; view: 1277; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.006 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию