1 / МУ_ЭВМ+ПУ_ч1 / 2_МУ_ЭВМ+ПУ-доп_код
.docxЛабораторная работа 2
СЛОЖЕНИЕ И ВЫЧИТАНИЕ ЦЕЛЫХ ЧИСЕЛ
-
Цель работы
Исследование особенностей операций сложения и вычитания целых чисел (знаковых и беззнаковых) в ЭВМ
-
Дополнительный код
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.
ПРИМЕРЫ
-
Дополнительным кодом числа -6 является:
байт FAh (= 256 – 6 = 250 (10) = FA (16))
слово FFFA (16)
двойное слово FFFFFFFA (16).
-
Дополнительным кодом числа +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.
-
Беззнаковые целые числа
-
Сложение
Беззнаковые числа складываются по правилам сложения двоичных чисел. Однако возникает проблема: что делать, если сумма получится очень большой - такой, что она не умещается в отведенную ячейку? Например, при сложении байтовых чисел 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 Вычитание
Объявляя, что та или иная операция выполняется с данными определенного типа, понимают, что и операнды, и результат являются данными этого типа.
При вычитании беззнаковых чисел возможно появление следующей проблемы: если уменьшаемое меньше вычитаемого, получается отрицательная разность, естественно, не принадлежащая области беззнаковых чисел. Правило вычитания учитывает эту возможность и корректирует ее следующим образом.
Если выполняется вычитание Х – У и при этом:
-
Х ≥ У, выполняется обычное вычитание;
-
Х < У, тогда числу Х дается "заем" единицы, то есть к числу Х прибавляется величина 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. Принять, что числа имеют размер байт.
-
(-5) + 5
-
(-5) – (-5)
-
(-5) – 10
-
5 – (-10)
-
5 + (-10)
-
125 + 202
-
125 – 202
-
100 + 100 (беззнаковые числа)
-
100 + 100 (знаковые числа)
-
120 – 100 (беззнаковые числа)
-
120 – 100 (знаковые числа)