Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика и ВТ Брукшир.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
5.07 Mб
Скачать

1.6.2Сложение в двоичном дополнительном коде

Для сложения чисел в двоичном дополнительном коде применяется такой же алгоритм, как для двоичного сложения, только в этом случае все коды, включая результат операции, будут иметь одинаковую длину. Это означает, что если в результате сложения появляется дополнительный бит с левого края, он будет отсечен. Именно поэтому 0101 и 0010 в сумме дают 0111, а сумма 0111 и 1011 равна 0010 (0111 + 1011 = 10010, которая усекается до 0010).

Рассмотрим три примера сложения в дополнительном коде (рис. 1.22). В каждом случае десятичная запись была представлена 4-битовым кодом, а результат сложения опять переведен в десятичную систему счисления.

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

В отличие от школьников, которые сначала должны научиться сложению, а затем вычитанию, машине, в которой используется представление в двоичном дополнительном коде, нужно научиться выполнять только операции сложения и отрицания. Например, операция вычитания 7-5 аналогична операции сложения 7 + (-5). Следовательно, если потребуется вычесть 5 (с кодом 0101) из 7 (с кодом 0111), то машина, прежде всего, заменит 5 на —5 (с кодом 1011) и затем выполнит операцию сложения, результатом которой будет 0010, то есть код числа 2:

Мы видим, что если для представления чисел используется двоичный дополнительный код, то для выполнения операций сложения и вычитания достаточно комбинации схем сложения и отрицания (об этих схемах рассказывается в приложении Б).

1.6.3Проблема переполнения

Одной из проблем, которых мы избегали в предшествующих примерах, но которые существуют в любом представлении в двоичном дополнительном коде, является ограничение на размер чисел, представимых данным количеством битов. Однако если мы используем 4-битовый двоичный дополнительный код, то у числа 9 не будет соответствующей записи. Это означает, что мы не получим правильного ответа, выполнив операцию сложения 5 + 4. На самом деле мы получим ответ — 7. Такая ошибка называется переполнением (overflow), она возникает тогда, когда нужно сохранить число, не попадающее в диапазон чисел, которые могут быть представлены в двоичном дополнительном коде. Переполнение может возникнуть, когда нужно сложить два положительных или два отрицательных числа. В обоих случаях можно проверить, есть ли ошибка, посмотрев на знаковый разряд полученного результата, то есть переполнение возникло, если сумма двух положительных чисел имеет код отрицательного числа или сумма двух отрицательных чисел имеет код положительного числа.

Конечно, поскольку большинство машин манипулируют более длинными последовательностями битов, чем те, которые мы обсуждали, операции с большими числами не вызывают переполнения. Сегодня принято использовать 32-битовые последовательности для хранения чисел в двоичном дополнительном коде, что позволяет порождать числа до 2 147 438 647, прежде чем возникнет переполнение. Если нужно записать большее число, то можно использовать более длинный код или можно изменить единицы измерения. Например, использование в расчетах миль, а не дюймов позволит уменьшить размер чисел и достичь необходимой точности вычислений.

Суть проблемы состоит в том, что компьютер может ошибаться, и пользователь должен знать о возможной опасности такой ошибки. Программисты и пользователи стали слишком самоуверенными и игнорируют тот факт, что маленькие числа могут складываться и порождать большие. Например, раньше было принято использовать 16-битовый двоичный код, который означал, что переполнение не возникнет, пока не появится значение 2Ь = 32 768. Девятнадцатого сентября 1989 года компьютерная система в госпитале допустила ошибку после долгих лет надежной работы. Исследование показало, что тот день был 32 768-м днем после 1 января 1900 года. Как вы думаете, какова цена этой ошибки?