Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии 


Выполнение арифметических операций над целыми числами.




Целые числа в ЭВМ могут представляться без знака и со знаком. Без знака – обычно занимают в памяти ЭВМ один или два байта. В однобайтовом диапазон – от 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

№ кодовой комбинации Код с избытком Десятичное значение
-1
-2
-3
-4

Из таблицы видно, что числа 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; Просмотров: 942; Нарушение авторского права страницы


lektsia.com 2007 - 2022 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.021 с.) Главная | Обратная связь