Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Выполнение арифметических операций над целыми числами. ⇐ ПредыдущаяСтр 4 из 4
Целые числа в ЭВМ могут представляться без знака и со знаком. Без знака – обычно занимают в памяти ЭВМ один или два байта. В однобайтовом диапазон – от 0 до 255, в двухбайтовом – от 0 до 65535. Целые числа со знаком обычно занимают один, два или четыре байта. Диапазон: в однобайтовом от -127 до +127, в двухбайтовом от -32767 +32767. Применяются три формы кодирования целых чисел со знаком – прямой, обратный и дополнительный коды. Прямой код – он отличается от двоичного тем, что в нем отводится один, как правило старший разряд отводится под знак, а оставшиеся разряды – для записи значащих цифр. Если знаковый разряд 0 – число положительно. Если 1 – отрицательно. Для прямого кода:
Здесь aзн – значение знакового разряда, n – разрядность кода. Допустим, есть число 11012 (-1)1*(1*22+0*21+1*20)=5 Дополнительный код. Использование чисел со знаком (использование прямого кода) усложняет структуру ЭВМ, ибо операция сложения двух чисел с разными знаками должна быть заменена операцией вычитания меньшего из большего с последующим присвоением результату знака большей величины. В современных ЭВМ отрицательные числа представляются в виде дополнительного (или обратного) кодов, в результате чего операция вычитания заменяется на обычное сложение, чем существенно упрощается арифметико-логическое устройство машины. Смысл перевода (на примере десятичных чисел): Пусть ЭВМ оперирует с двухразрядыми десятичными числами, и нужно сложить два числа. Х1=84, X2= -32. Заменим код отрицательного числа на его дополнение до 100. Хдоп=100-32=68. Теперь сложим Х1 + Хдоп = 84 + 68 = 152. Учитывая, что ЭВМ работает с двумя десятичными разрядами, конечный результат будет 52. Истинное значение получается потому, что при формировании дополнительного кода (Хдоп) мы сначала прибавляем 100, а затем 100 вычитаем, отбрасывая единицу старшего разряда. Таким образом, дополнение М можно высчитать по формуле:
Где p – основание системы счисления, n – величина разрядной сетки, k – отрицательное число. Дополнение числа можно получить и без вычитания. Перепишем выражение:
Здесь величина (pn – 1) состоит из n цифр (p - 1). Поэтому величину (pn - 1 – к) можно получить путем образования дополнений до (p – 1) для каждой из цифр числа «k» в отдельности, а искомое дополнение получится суммированием этого числа с единицей. Так как в двоичной системе дополнение цифр до единицы соответствует их инверсным значениям, то получается простое правило получения дополнения для двоичных чисел. 1) Получить инверсию заданного числа ( 0 на 1, 1 на 0 заменить), 2) Образовать дополнительный код заданного числа путем прибавления 1 к инверсии этого числа. Проверка правильности результата: Сумма исходного числа и его дополнительного кода должна быть равна 0. Старший бит дополнительного кода так же выполняет функцию знака. При этом положительные числа в дополнительном коде изображаются так же, как и в прямом, с цифрой 0 в старшем разряде. Для дополнительного кода справедливо следующее выражение:
Например, получим десятичную запись отрицательного числа, представленную в дополнительном коде: 10112 à A10 = 1*(-23) + 0*22 + 1*21 + 1*20 = -5 ОБРАТНЫЙ КОД Также используется для представления отрицательных чисел. Он получается инвертированием всех цифр двоичного кода абсолютной величины числа (модуля числа). Отметим, что все операции с отрицательными числами выполняются в формате машинного слова. Это значит, что к двоичному числу слева дописываются нули до нужного количества разрядов. Например, для 8-миразрядного машинного слова 00000001: 11111110. (данное число является модулем числа -1) Приведем пример к данной формуле: 10102 – обратный код A10 = 1*(-23 + 1) + [0*22 + 1*21 + 0*20] = -5 Для положительных чисел aзн=0, и представление числа полностью совпадает с прямым и дополнительным кодом. Таким образом, положительные числа в прямом, обратном и дополнительном кодах изображаются одинаково, то есть двоичными кодами в нулем в знаковом разряде. Обычно отрицательные десятичные числа при вводе в машину автоматически преобразуются в обратный или дополнительный двоичный код, и в таком виде хранятся и участвуют в различных операциях. При выводе таких чисел происходит обратное преобразование в отрицательные десятичные. Выполнение арифметических операций (сложение и вычитание) Как уже отмечали, вместо операции «вычитание» производится сложение обратных или дополнительных кодов. При сложении двух чисел X и Y имеет место четыре основных и два особых случая. I. X Y > 0 При суммировании складываются все разряды, включая разряд знака. II. X > 0 Y < 0 |X|< |Y|
3 + (-10) = (-7) (-10)à 1110101 00000011 + 11110101 = 11111000 (обратный код -7)
III. X > 0 Y < 0 |X|> |Y|
10 + (-3) = 7 (-3)à 11111100 00001010 + 11111100 = 00000110 + 1 = 00000111
Машина исправляет полученный изначально некорректный результат (6 вместо 7) переносом единицы из знакового разряда в младший разряд суммы.
IV. X < 0 Y < 0
(-3) + (-7) = (-10) 11111100 + 11111000 = 11110100 + 1 = 11110101
Полученный первоначально некорректный результат -11 вместо -10 машина исправляет переносом единицы из знакового разряда в младший разряд суммы. При переводе результата в прямой код биты цифровой части (то е без знаковой) числа инвертируются. Рассмотрим два случая переполнения. X Y > 0 65 + 97 = 162 01000001+ 01100001 = (1)0100010 Здесь происходит несовпадение знака суммы и знаков слагаемых. X Y < 0 (-63) + (-95) = (-158) 11000000 + 10100000 = (0)1100000 Здесь так же знак суммы не совпадает со знаками слагаемых, что свидетельствует о переполнении разрядной сетки. X Y > 0 X + Y ≤ 215 X = 1594 Y = 17563 X+Y=19157 0000 0110 0011 1010 + 0100 0100 1001 1011 = 0100 1010 1101 0101 |X| < |Y| X = 1594 Y = -17563 X+Y=-15969 0000 0110 0011 1010 + 1011 1011 0110 0101 = 1100 0001 1001 1111 |X| > |Y| X = 17536 Y = -1594 X+Y=15969 0100 0100 1001 1011 + 1111 1001 1100 0110 = 0011 1110 0110 0001 В последнем случае перенос не учитывается! X Y < 0 |X| + |Y| < 215 X = -1594 Y = -17563 X+Y=-19157 1111 1001 1100 0110 + 1011 1011 0110 0101 = 1011 0101 0010 1011 Перенос опять же не учитывается! V. X> 0 Y> 0 |X| + |Y| > 215 X = 17563 Y = 19157 0100 0100 1001 1011 + 0100 1010 1101 0101 = 1000 1111 0111 0000 Ответ некорректен ввиду переполнения разрядной сетки. Инвертируем ( +1)
VI. X< 0 Y< 0 |X| + |Y| > 215 X = -17563 Y = -19157 1011 1011 0110 0101 + 1011 0101 0010 1011 = 0111 0000 1001 0000 Ответ некорректен ввиду переполнения разрядной сетки. В 5 и 6 случаях ограниченная разрядность чисел приводит к искажению не только величины, но и знака результата. Это исправляется добавлением к результату (случай 5) или вычитанием из него (случай 6) числа 216. Для обеспечения корректности вычислений перед суммированием необходимо анализировать знаки слагаемых и результаты. Разные знаки слагаемых или совпадение знаков слагаемых со знаком суммы свидетельствует о том, что результат правильный. Для контроля за выполнением арифметических операций в процессоре содержатся два индикатора: переноса и переполнения. Каждый индикатор принимает либо 0, либо 1. Таким образом, после завершения арифметической операции, в которой происходит перенос в старший бит, индикатор переполнения принимает значение 1. Нет переноса – значение 0. Аналогично работает индикатор переполнения. Таким образом, пользователь имеет возможность контролировать правильность выполнения арифметических операций. СМЕЩЕННЫЙ КОД И КОД ГРЕЯ. Смещенный код (или двоичный код с избытком) используется для упрощения операций над порядками чисел с плавающей запятой. Он формируется: 1) Выбирается длина разрядной сетки n. 2) Последовательно записываются все возможные кодовые комбинации в обычной двоичной системе счисления. 3) Кодовая комбинация с единицей в старшем разряде (её значение 2n-1) выбирается для представления числа 0. 4) Все последующие комбинации с единицей в старшем разряде представляют числа 1, 2, 3 и так далее соответственно, а предыдущие: -1, -2, -3 и так далее. Представим n=3
Из таблицы видно, что числа 3 и -3 в формате со смещением для 3-х разрядной сетки представляются соответственно 111 и 001. Для 4-х разрядной: 1011 и 0101. Очевидно, что различия между двоичным кодом с избытком (или смещенным кодом) и двоичным дополнительным кодом состоит в противоположности знаковых битов, а разность значений кодовых комбинаций. Разность значений кодовых комбинаций в обычном двоичном коде и двоичном коде с избытком, например для 3-х и 4-х разрядных сеток, равна 4 и 8. Например, число 7 в обычном двоичном коде: 111, а 111 в коде с избытком соответствуют числу +3. Отсюда 7 – 3 = 4. Число 1 в обычном коде 001, а 001 в коде с избытком: -3. Отсюда 1 – (-3) = 4. В связи с этим смещенный код для 3-х разрядной сетки называют двоичным кодом с избытком 4. Для 4-хразрядной – с избытком 8. Для n-разрядной сетки: с избытком 2n-1 Смещенный код используется для упрощения операций над порядками чисел с плавающей запятой. Каким образом, будет показано позже. В случае 8-ми разрядного порядка используется код с избытком 128. При этом порядок принимает значения от -128 до +127. Такое представление позволяет работать с порядками к с целыми числами без знака. Код Грея используется в различных преобразовательных устройствах. Его цель – разрешить проблемы, связанные с возможностью одновременного изменения нескольких разрядов кодового числа. Особенностью кода Грея является то, что в нем соседние кодовые комбинации различаются только в одном разряде.
Правило перевода из кода Грея в обычный двоичный код: 1) Первая единица со стороны старших разрядов остается без изменения. 2) Последующие цифры 0 или 1 остаются без изменения, если число единиц им предшествующих четно и инвертируется, если не четно. Например, при решении вопросов позиционирования использование кода Грея позволяет свести к единице младшего разряда погрешность при считывании информации с датчиков положения.
Имеем число в коде Грея 1011. Переводим в обычный код: · Первая слева цифра 1 остается без изменений. · Вторую цифру (0) инвертируем, так как перед ней одна единица. · Третья цифра (1) опять инвертируется, так как перед ней одна единица. · Четвертую цифру оставляем без изменений, так как перед ней две единицы. Таким образом числу 1011 в коде Грея соответствует число 1101.
Популярное:
|
Последнее изменение этой страницы: 2016-04-10; Просмотров: 1238; Нарушение авторского права страницы