Основу арифметических действий над целыми числами составляют двоичные таблицы сложения и умножения (рис. 6, слайд 10).
Рис. 6. Двоичные таблицы сложения и умножения
Сложение и вычитание
При выполнении этих операций отрицательные числа представляются в дополнительном коде. Применение дополнительного кода позволяет свести операцию вычитания чисел к арифметическому сложению кодов этих чисел (одно из которых с отрицательным знаком), а также упрощает определение знака результата операции и облегчает выработку признаков переполнения разрядной сетки. В результате упрощаются устройства компьютеров, выполняющие арифметические операции.
При выполнении алгебраического сложения знаковый разряд и цифры модуля числа рассматриваются как единое целое и обрабатываются совместно. При этом единица переноса из знакового разряда отбрасывается.
Рассмотрим ряд примеров (слайды 12-13). Здесь при сложении чисел А и В возможны четыре основных и два особых случая:
1. A и B положительные. При суммировании складываются все разряды, включая разряд знака. Так как знаковые разряды положительных слагаемых равны нулю, то и разряд знака суммы тоже равен нулю. Например:
|
|
Десятичная запись Двоичные коды
3 0 0000011
+ 7 + 0 0000111
10 0 0001010
2. А положительное, B отрицательное и по абсолютной величине больше, чем А (|A| < |B|). Например:
Десятичная запись Двоичные коды
3 0 0000011 – Прямой код числа 3
+ -10 + 1 1110110 – Дополн. код числа -10
-7 1 1111001 – Дополн. код числа -7
1 0000111 – Прямой код числа -7
Если результат получен со знаком минус (1 в старшем разряде), то при переводе в прямой код разряды цифровой части результата инвертируются.
3. A положительное, B отрицательное и по абсолютной величине меньше, чем А (|A| > |B|). Например:
Десятичная запись Двоичные коды
10 0 0001010 – Прямой код числа 10
+ -3 + 1 1111101 – Дополн. код числа -3
7 ┌ 0 0000111
└───→ – Перенос отбрасывается
0 0000111 – Доп. и прямой код числа 7
В результате сложения получается переполнение разрядной сетки, в этом случае единица переноса из знакового разряда отбрасывается.
4. А и B отрицательные. Например:
Десятичная запись Двоичные коды
-3 1 1111101 – Дополн. код числа -3
+ -7 + 1 1111001 – Дополн. код числа -7
-10 ┌ 1 1110110
|
|
└ ───→ – Перенос отбрасывается
1 1110110 – Дополн. код числа -10
1 0001010 – Прямой код числа -10
Полученная единица переноса из знакового разряда отбрасывается. При преобразовании в прямой код цифровая часть результата инвертируется.
При сложении может возникнуть ситуация, когда старшие разряды результата операции не помещаются в отведенной для него области памяти. Такая ситуация называется переполнением разрядной сетки формата числа. Для обнаружения переполнения и оповещения о возникшей ошибке в компьютере используются специальные средства. Ниже приведены примеры двух возможных случаев переполнения.
5. А и B положительные, сумма А+В больше либо равна 2n–1 (где n – количество разрядов формата чисел (для однобайтового формата n = 8, 2n–1 = 27 = 128) – вариант переполнения. Например:
Десятичная запись Двоичные коды
65 0 1000001 – Прямой код числа 65
+ 97 + 0 1100001 – Прямой код числа 97
162 1 0100010 – Переполнение
В этом примере семи разрядов цифровой части числового формата недостаточно для размещения восьмиразрядной суммы (16210 = 101000102), поэтому старший разряд суммы оказывается в знаковом разряде. Это вызывает несовпадение знака суммы и знаков слагаемых, что является свидетельствомпереполнения разрядной сетки.
6. А и B отрицательные, сумма абсолютных величин А и В больше, либо равна 2n–1 – вариант переполнения. Например:
Десятичная запись Двоичные коды
- 63 1 1000000 – Обратный код числа -63
+ - 95 + 1 0100000 – Обратный код числа -95
- 158 ┌ 0 1100000 – Переполнение
└───→ +1
Здесь знак суммы тоже не совпадает со знаками слагаемых, что свидетельствует о переполнении разрядной сетки.
Умножение и деление (слайд 14)
При выполнении этих операций отрицательные операнды преводятся в прямой код, а знак результата определяется, исходя из знаков операндов. Если результат отрицательный, то он преобразуется в дополнительный код.
Умножение целых двоичных чисел производится по тому же принципу, как это делается в десятичной системе счисления. В компьютере умножение производится как последовательность сложений и сдвигов. Для этого в арифметико-логическом устройстве (АЛУ) имеется регистр, называемый накапливающим сумматором, который до начала выполнения операции содержит 0. В процессе выполнения операции в нем поочередно размещаются множимое и результаты промежуточных сложений, а по завершении операции – окончательный результат.
Другой регистр АЛУ, участвующий в выполнении этой операции, вначале содержит множитель. Затем по мере выполнения сложений содержащееся в нем число уменьшается, пока не достигнет нулевого значения.
Пример. Умножим 1100112 на 1011012 (5110×4510 = 229510).
Накапливающий регистр Множитель
000000000000 │ 101101
+ 110011 │
110011 │ 101100
+ 110011 │ Сдвиг на две позиции влево
11111111 │ 101000
+ 110011 │ Сдвиг на одну позицию влево
1010010111 │ 100000
+ 110011 │ Сдвиг на две позиции влево
100011110111 │ 000000
Операция деления, как и в десятичной арифметике, является обратной операции умножения. Деление для компьютера является трудной операцией. Обычно оно реализуется как последовательность операций сложения и сдвига, т.е. путем многократного прибавления к делимому дополнительного кода делителя. Пример. Разделим 1011012 на 1012 (4510 / 510 = 910). | |
ДелимоеДелитель _ 101101 │ 101 101 │ 1001 –частное _ 0101 101 0 –остаток отсутствует |
Деление произведено так же, как это делается обычно в десятичной системе. Сначала проверяется, можно ли вычесть значение делителя из старших разрядов делимого. Если возможно, то в разряде частного записывается единица и определяется частная разница. В противном случае в частное записывается нуль, и разряды делителя сдвигаются вправо на один разряд по отношению к разрядам делимого. К полученной предыдущей разнице сносится очередная цифра делимого, и данный процесс повторяется, пока не будет получена необходимая точность.
|
|
Если учесть, что все вычитания в компьютере заменяются сложением в дополнительном коде, то действительно операция деления приводится к операциям сложения и сдвигам вправо разрядов делителя относительно разрядов делимого. Отметим, что делимое перед операцией деления должно быть приведено к 2n -разрядной сетке. Только в этом случае при делении на n -разрядный делитель получается n -разрядное частное.
Знак частного формируется путем сложения знаковых разрядов делимого и делителя, так же, как это делалось при умножении.