Алгоритм сложения чисел в двоичном дополнительном коде такой же, как для двоичного сложения, только здесь все коды, включая результат операции, будут иметь одинаковую длину. Это значит, что если в результате сложения появляется дополнительный бит с левого края, он будет отсечен. Именно поэтому 0101 и 0010 в сумме дают 0111, а сумма 0111 и 1011 равна 0010 (0111 + 1011 = 10010, которая усекается до 0010).
Рассмотрим примеры сложения в дополнительном коде. В каждом случае десятичная запись представлена 4-битовым кодом, а результат сложения опять переведен в десятичную систему счисления.
Обратим внимание на то, что согласно правилам традиционной алгебры, которые мы изучали в школе, то в третьем примере нам бы потребовалась совсем другая операция (вычитание). С другой стороны, в двоичном дополнительном коде мы можем вычислить результат, во всех случаях применяя алгоритм сложения.
В этом и состоит главное преимущество представления чисел в двоичном дополнительном коде: сложение любых комбинаций положительных и отрицательных чисел может быть выполнено с использованием одного алгоритма и, следовательно, одной схемы.
|
|
Сложение в десятичной системе счисления | Сложение в двоичном дополнительном коде | Результат сложения в десятичной записи |
+4 3 | +0100 0011 0111 | 7 |
+-2 -3 | +1110 1101 1011 | -5 |
+6 -2 | +0110 1110 0100 | 4 |
Рис. 1.11. Таблица сложений чисел
Например, операция вычитания 7-5 аналогична операции сложения 7 + (-5). Следовательно, если потребуется вычесть 5 (с кодом 0101) из 7 (с кодом 0111), то машина, прежде всего, заменит 5 на -5 (с кодом 1011) и затем выполнит операцию сложения, результатом которой будет 0010, то есть код числа 2:
-7 -0111 +0111
5 0101 1011
2 0010
Проблема переполнения
Есть проблема в любом представлении чисел в двоичном дополнительном коде - ограничение на размер чисел, представляемых данным количеством битов. Например, нельзя получить правильного ответа, выполнив операцию сложения 5 + 4, если будем выполнять сложение в 4-битовом двоичном дополнительном коде. Ведь у числа 9 нет соответствующей записи. На самом деле мы получим ответ — 7. Такая ошибка называется переполнением (overilov), она возникает, когда нужно сохранить число, не попадающее в диапазон чисел, которые могут быть представлены в двоичном дополнительном коде. Переполнение возникает, когда нужно сложить два положительных или два отрицательных числа. В обоих случаях можно проверить, есть ли ошибка, посмотрев на знаковый разряд полученного результата, то есть переполнение возникает, если сумма двух положительных чисел имеет код отрицательного числа или сумма двух отрицательных чисел имеет код положительного числа.
|
|
Большинство машин манипулируют более длинными последовательностями битов, чем те, которые здесь обсуждаются, и операции с большими числами не вызывают переполнения. В настоящее время принято использовать 32-битовые последовательности для хранения чисел в двоичном дополнительном коде, что позволяет порождать числа до
2 147 438 647, прежде чем возникнет переполнение. Если нужно записать большее число, то можно использовать более длинный код или можно изменить единицы измерения. Например, использование в расчетах километров, а не метров позволит уменьшить размер чисел и достичь необходимой точности вычислений.
Проблема состоит в том, что компьютер может ошибаться, и пользователь должен знать о возможной опасности такой ошибки. Программисты и пользователи из-за своей самоуверенности игнорируют тот факт, что маленькие числа могут складываться и порождать большие. Например, раньше было принято использовать 16-битовый двоичный код, который означал, что переполнение не возникнет, пока не появится значение 215 = 32 768. Например девятнадцатого сентября 1989 года компьютерная система в госпитале допустила ошибку после долгих лет надежной работы. Исследование показало, что тот день был 32 768-м днем после 1 января 1900 года. Как вы думаете, какова цена этой ошибки?
Представление с избытком
Другой способ представления целочисленных значений называется представлением с избытком (excess notation). Коды, соответствующие числовым значениям, имеют одинаковую длину. Для того чтобы составить таблицу кодов, сначала нужно выбрать длину последовательности битов, затем выписывать эти наборы в прямом порядке. Можно заметить, что код с одной 1 в позиции старшего разряда находится примерно посередине списка. Пусть он будет представлением нуля; коды до него используются для представления 1, 2, 3 и т. д., коды после него используются для -1,-2, -3 и т. д. Окончательный вариант таблицы 4-битовых кодов изображен в таблицах на рис 1.12. Можно заметить, что число 5 имеет код 1101, а число -5 имеет код 0011. Обратите внимание на то, что различие между представлением в двоичном дополнительном коде и избыточном коде заключается в том, что знаковый разряд у них имеет противоположное значение.
Таблица кодов, изображенная на рисунке 1.12, называется представлением с избытком восемь. Для того чтобы понять, почему это так, сначала переведём коды из таблицы в десятичную систему счисления, как обычный двоичный код, и сравним полученные значения со значениями в таблице. В каждом случае мы обнаружим, что полученный результат превосходит код в представлении с избытком на восемь. Например, последовательность 1100 в двоичной системе является кодом 12, но в представлении с избытком она является кодом 4; последовательность 0000 в двоичной системе является кодом 0, а в представлении с избытком — кодом 8. Точно так же 5-битовое представление с избытком будет называться представлением с избытком 16, так как, например, последовательность 10000 будет кодом 0, а не 16, как в двоичной записи.
Можно убедиться, что 3-битовое представление с избытком является представлением с избытком четыре.
Набор битов | Значение | Набор битов | Значение | |
1111 | 7 | 111 | 3 | |
1110 | 6 | 110 | 2 | |
1101 | 5 | 101 | 1 | |
1100 | 4 | 100 | 0 | |
1011 | 3 | 011 | -1 | |
1010 | 2 | 010 | -2 | |
1001 | 1 | 001 | -3 | |
1000 | 0 | 000 | -4 | |
0111 | -1 | |||
0110 | -2 | |||
0101 | -3 | |||
0100 | -4 | |||
0011 | -5 | |||
0010 | -6 | |||
0001 | -7 | |||
0000 | -8 |
Рис. 1.12. 4-битовое и 3-битовое представление с избытком
Хранение дробей
Для хранения чисел с дробной частью требуется хранить не только двоичное представление числа, но также позицию разделительной точки. Общепринятым способом хранения дробей является представление с плавающей точкой.
|
|