Лабораторная работа 2 сложение и вычитание целых чисел
-
Цель работы
Исследование особенностей операций сложения и вычитания целых чисел (знаковых и беззнаковых) в ЭВМ
-
Дополнительный код
2.2.1 В ПК делается различие между целыми числами без знака (неотрицательными) и знаковыми [11].
Целые числа со знаком записываются в дополнительном коде по правилу:
X , если X ≥ 0
2
Доп
(x) =
где k – общее количество разрядов,
отведенных под число X
Если k = 8 (байт), то правило конкретизируется:
( 2 )
Доп
(x) =
256 - | X | , если -128 ≤ X ≤ -1
ПРИМЕРЫ
-
Дополнительным кодом числа -6 является:
байт FAh (= 256 – 6 = 250 (10) = FA (16))
слово FFFA (16)
двойное слово FFFFFFFA (16).
-
Дополнительным кодом числа +98 является:
байт 98 (10) = 62 (16)
слово 0062 (16) .
Левый бит дополнительного кода играет роль знакового: для неотрицательных чисел он равен 0, для отрицательных 1.
2.2.2 Для перевода числа из дополнительного кода в обычное представление необходимо:
-
сравнить дополнительный код доп (X) с величиной наибольшего неотрицательного числа рассматриваемого размера (типа), равного ( 2k-1 – 1):
е
(
3 )
если доп (X) > 2 k-1 – 1, то |X| = 2 k – доп (X), а X отрицательно.
В приведенных формулах |X| - модуль (абсолютная величина) числа, а k – общее количество разрядов в ячейках, отведенных под число X. Если k = 8 (рассматривается байт), то чтобы получить число по его дополнительному коду нужно сравнить дополнительный код доп (X) с числом 127:
е
(
4 )
если доп (X) > 127 то |X| =256 – доп (X), а X - отрицательно.
ПРИМЕР
Дополнительный код числа размером байт равен 3. Определить величину числа.
Так как 3 127, то X = доп (Х) = 3.
ПРИМЕР
Дополнительный код числа размером байт равен 253. Определить величину числа.
Так как 253 > 127, значит число отрицательное, а его модуль определяют по формуле:
|X| = 256 – доп (Х) = 256 – 253 = 3
Таким образом, X = - 3.
-
Беззнаковые целые числа
2.3.1 Сложение
Беззнаковые числа складываются по правилам сложения двоичных чисел. Однако возникает проблема: что делать, если сумма получится очень большой - такой, что она не умещается в отведенную ячейку? Например, при сложении байтовых чисел 250 и 10 получится число 260 (100000100b – 9 разрядов), которое не "влезает" в ячейку размером в байт.
В этом случае ошибка не фиксируется, левая единица (единица переноса) отбрасывается, и в качестве ответа выдается искаженная сумма (в рассматриваемом примере ответом будет байт 0000 0100b, т. е. число 4). При этом во флаг переноса CF записывается 1. Это сигнал о том, что получилась неправильная сумма (если переноса не было, то в CF записывается 0).
Отбрасывание 1 в разряде номер 8 (девятая единица по счету справа) равноценно вычитанию числа 1 0000 0000 b (= 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, что сигнализирует о неправильном результате.