Арифметические действия над целыми числами со знаком

 

Основу арифметических действий над целыми числами составляют двоичные таблицы сложения и умножения (рис. 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 -разрядное частное.

Знак частного формируется путем сложения знаковых разрядов делимого и делителя, так же, как это делалось при умножении.

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: