Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

1 / МУ_ЭВМ+ПУ_ч1 / 2_МУ_ЭВМ+ПУ-доп_код

.docx
Скачиваний:
24
Добавлен:
28.05.2015
Размер:
50.77 Кб
Скачать

Лабораторная работа 2

СЛОЖЕНИЕ И ВЫЧИТАНИЕ ЦЕЛЫХ ЧИСЕЛ

    1. Цель работы

Исследование особенностей операций сложения и вычитания целых чисел (знаковых и беззнаковых) в ЭВМ

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

2.2.1 В ПК делается различие между целыми числами без знака и знаковыми [7]. В таблице 2.1 представлена схема формирования чисел типа байт.

Таблица 2.1 – Схема формирования байтовых чисел

Целые числа со знаком записываются в дополнительном коде по правилу:

X , если 0 ≤ X ≤ 2 k-1 – 1

2k - | X | , если -2 k-1≤ X ≤ -1, ( 1 )

Доп (x) =

где k – общее количество разрядов,

отведенных под число X

Если k = 8 (байт), то правило конкретизируется:

X , если 0 ≤ X ≤ 127

( 2 )

Доп (x) =

256 - | X | , если -128 ≤ X ≤ -1

Левый бит дополнительного кода играет роль знакового: для неотрицательных чисел он равен 0, для отрицательных 1.

ПРИМЕРЫ

  1. Дополнительным кодом числа -6 является:

байт FAh (= 256 – 6 = 250 (10) = FA (16))

слово FFFA (16)

двойное слово FFFFFFFA (16).

  1. Дополнительным кодом числа +98 является:

байт 98 (10) = 62 (16)

слово 0062 (16)

2.2.2 Для перевода числа из дополнительного кода в обычное представление необходимо сравнить дополнительный код доп (X) с величиной наибольшего неотрицательного числа рассматриваемого размера (типа), равного ( 2k-1 – 1):

если доп (X)  2 k-1 – 1, то X = доп (X);

( 3 )

если доп (X) > 2 k-1 – 1, то |X| = 2 k – доп (X), а X отрицательно.

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

Если k = 8 (байт), то чтобы получить число по его дополнительному коду нужно сравнить дополнительный код доп (X) с числом 127:

если доп (X)  127, то X = доп (X);

( 4 )

если доп (X) > 127 то |X| =256 – доп (X), а X - отрицательно.

ПРИМЕР

Дополнительный код числа размером байт равен 3. Определить величину числа.

Так как 3  127, то X = доп (Х) = 3.

ПРИМЕР

Дополнительный код числа размером байт равен 253. Определить величину числа.

Так как 253 > 127, значит число отрицательное, а его модуль определяют по формуле: |X| = 256 – доп (Х) = 256 – 253 = 3

Таким образом, X = - 3.

    1. Беззнаковые целые числа

      1. Сложение

Беззнаковые числа складываются по правилам сложения двоичных чисел. Однако возникает проблема: что делать, если сумма получится очень большой - такой, что она не умещается в отведенную ячейку? Например, при сложении байтовых чисел 250 и 10 получится число 260 (=100000100 – 9 разрядов), которое не "влезает" в ячейку размером в байт.

В этом случае ошибка не фиксируется, левая единица (единица переноса) отбрасывается, и в качестве ответа выдается искаженная сумма (в рассматриваемом примере ответом будет байт 0000 0100, т. е. число 4). При этом во флаг переноса CF записывается 1. Это сигнал о том, что получилась неправильная сумма (если переноса не было, то в CF записывается 0).

Отбрасывание 1 в разряде номер 8 (девятая единица по счету справа) равноценно вычитанию числа 1 0000 0000 (= 28 = 256).

ПРИМЕР

Сложить беззнаковые числа 18 и 200 ( тип – байт ).

Сумма 18 + 200 = 218 <= 255, следовательно, сумма «помещается» в байт, результат верен в математическом смысле и флаг CF = 0 .

ПРИМЕР

Сложить беззнаковые числа 58 и 200 (тип – байт ).

Сумма чисел (58 + 200 = 258) больше 255 , то есть, байта «не хватает» для ее размещения, следовательно, бит номер 8 «теряется», что равноценно вычитанию из суммы числа 256. Сумма будет фиксирована как

(58 + 200) – 256 = 2.

Так как с точки зрения математики получен неправильный результат, флаг CF = 1 (был перенос).

2.3.2 Вычитание

Объявляя, что та или иная операция выполняется с данными определенного типа, понимают, что и операнды, и результат являются данными этого типа.

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

Если выполняется вычитание Х – У и при этом:

  1. Х ≥ У, выполняется обычное вычитание;

  2. Х < У, тогда числу Х дается "заем" единицы, то есть к числу Х прибавляется величина 2k , (при K = 8 - байт - прибавляется число 1 0000 0000 (2) = 28 = 256) и только после этого производится вычитание. Полученное таким образом число и объявляется разностью. Факт произведенного "заема" фиксируется тем, что во флаг переноса CF записывается 1.

ПРИМЕР

Определить разность 1-2 (размер – байт, числа беззнаковые).

Так как 1 < 2 , то выполняется «заем» и только после этого производится вычитание: ( 1 + 256 ) – 2 = 255.

Число 255 объявляется результатом вычитания 1-2. При этом ошибка не фиксируется, но во флаг переноса CF заносится 1, что сигнализирует о неправильном результате.

2.4 Знаковые целые числа

2.4.1 Сложение и вычитание знаковых чисел

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

Если результат операции со знаковыми числами не верен в математическом смысле, то флаг переполнения OF получает значение 1, и значение 0 – если результат правильный.

ПРИМЕР

Сложить байтовые числа +3 и (-1).

Получаем дополнительные коды чисел, это соответственно 3 и ( 256 - 1) = 255.

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

Сумма кодов 3 + 255 больше 255, то есть результат не вмещается в байт. Следовательно, бит номер 8 «теряется», а это приводит к уменьшению суммы на 256. За результат сложения кодов принимается число ( 3 + 255 ) – 256 = 2. Факт того, что был перенос фиксируется флагом CF = 1 (коды – числа беззнаковые!!! ).

Полученная величина 2 рассматривается как дополнительный код результата. В соответствии с п.2.2.2 искомая сумма равна +2.

Результат правильный, следовательно, флаг OF равен 0.

ПРИМЕР

Сложить байтовые числа ( -3 ) и +1.

Дополнительные коды этих чисел: ( 256 – 3 ) =253 и 1.

Складываем дополнительные коды как беззнаковые числа: 253 +1 = 254. Полученная сумма меньше 255 (ей «хватает» байта), значит флаг CF равен 0.

Рассматривая полученную величину как дополнительный код ответа, определяем соответствующее ему число: так как 254 > 127, то, в соответствии с п. 2.2.2, искомое число отрицательно, а его абсолютная величина рассчитывается по формуле: 256 - 254 = 2, таким образом, число равно -2.

Результат правильный, следовательно, флаг OF равен 0.

2.4.2 Возможные проблемы

Напомним, что при размере ячеек в 8 бит в дополнительном коде представляются только числа от -128 до +127.

Рассмотрим, к примеру, сложение знаковых байтовых чисел +127 и +2. Их дополнительные коды - беззнаковые числа 127 и 2, сумма кодов равна 129 – это код результата. Определяем знаковое число по его дополнительному коду. Так как 129 > 127, то модуль числа равен 256 – 129 = 127, а само число -127. Таким образом, при сложении двух положительных чисел получено отрицательное число!

Это произошло потому, что при представлении чисел в дополнительном коде левый разряд является знаковым, а на размещение самого числа (на так называемую мантиссу числа) отводятся, в случае байта, оставшиеся 7 правых разрядов. Самое большое число, которое можно разместить на семи позициях, это 1111111(2), то есть, 27 – 1 = 127 (10). В примере получился ответ 129, в двоичном представлении это 1000 000l (2). Восьмиразрядной мантиссе числа не хватило отведенных 7 разрядов, она "залезла" в знаковый разряд, изменив его на противоположный.

Такое «налезание» мантиссы ( цифровой части) числа на знаковый разряд называют "переполнением мантиссы".

Переполнение мантиссы фиксируется во флаге переполнения OF: он получает значение 1, если было переполнение (результат неправильный), и значение 0 – в противном случае (результат правильный).

Переполнение мантиссы возможно и при вычитании. Например, требуется вычислить (+127 ) - (-2 ).

Определяем дополнительные коды:

доп (+127) = 127

доп (-2) = 256 - 2 = 254

Так как уменьшаемое 127 меньше вычитаемого 254, выполняется заем:

(127 + 256 ) – 254 = 129,

при этом флаг CF = 1 (коды – беззнаковые числа).

Устанавливаем число по его коду. Так как 129 > 127, то модуль числа равен 256 – 129 = 127, а само число -127.

Это число и выдается как результат вычитания, хотя истинной разностью является число +129. Настоящая разность оказалась вне диапазона представимых знаковых чисел. Факт переполнения мантиссы фиксируется во флаге OF , равном 1.

2.5 Замечание о флагах

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

При работе с беззнаковыми числами представляет интерес флаг CF (был ли перенос или заем) и безразличен флаг OF. Для знаковых чисел информативен флаг OF (было ли переполнение мантиссы) и не представляет интереса флаг CF.

2.6 Задания для самостоятельной работы

Вычислить выражения, указать значения флагов CF и OF. Принять, что числа имеют размер байт.

  1. (-5) + 5

  2. (-5) – (-5)

  3. (-5) – 10

  4. 5 – (-10)

  5. 5 + (-10)

  6. 125 + 202

  7. 125 – 202

  8. 100 + 100 (беззнаковые числа)

  9. 100 + 100 (знаковые числа)

  10. 120 – 100 (беззнаковые числа)

  11. 120 – 100 (знаковые числа)

18

Соседние файлы в папке МУ_ЭВМ+ПУ_ч1