Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 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,дополнительный код. Соответственно, не для любого числа существует противоположное. Операцияизменения знака может потребовать дополнительной проверки. ● Сравнение. В отличие от сложения, числа в дополнительном коде нельзя сравнивать, как беззнаковые, иливычитать без расширения разрядности. Один из методов состоит в сравнении как беззнаковые исходныхчисел с инвертированным знаковым битом.
|