logo
Часть первая -3 октября

Машинная арифметика

Способы изображения числовой информации в ЦВМ тесно связаны с организацией выполнения арифметических действий над этими изображениями чисел.

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

Одним из достоинств двоичной системы счисления является возможность простой реализации не только сумматоров, но и схем, осуществляющих преобразования кодов из одной формы в другую, что позволяет практически осуществить выполнение всех арифметических операций с помощью операции суммирования кодов операндов.

Для изображения знака мантиссы и знака порядка числа в ЦВМ используются двоичные цифры 1 и 0. Например, знак «минус» изображается как «1», знак «плюс» - как «0». Так, число - 7 в ячейке памяти записывается как 1,111 ..., а число +7 - как 0,111 ... (запятая в ячейке никак не представлена и приведена здесь для удобства изложения) .

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

Идея состоит в том, что операцию вычитания чисел, записанных в любой позиционной системе счисления, можно заменить операцией сложения уменьшаемого с алгебраическим дополнением вычитаемого. Например, операцию 53 - 23 = 30 можно заменить операцией

где 77 - алгебраическое дополнение (100 - 23) числа ( -23) .

53

+

77

130

Очевидно, что если не учитывать старшую единицу результата, то ответ получится правильным (30) . Как следует из примера, такая замена операций вычитания сложением связана с поиском алгебраического дополнения отрицательного числа, что в свою очередь требует реализации операции вычитания (в нашем примере 100 - 23 = 77) .

Это противоречие легко устраняется в двоичной системе счисления, где алгебраическое дополнение числа можно получить путем простого преобразования прямого кода отрицательного числа. Опуская доказательство, можно сказать, что обратный код отрицательного числа можно получить путем замены всех значащих цифр его мантиссы на противоположные, т. е. нулей - единицами, а единиц - нулями.

Например, обратный код отрицательного числа -0,1010110 имеет вид 1,0101001. Дополнительный код этого числа отличается от обратного тем, что в младший разряд обратного кода добавляется единица, т. е.

1,0101001

+

1

1,0101010

Здесь 1,0101010- это дополнительный код числа-0,1010110. Простота аппаратного получения этих кодов делает идею замены операции вычитания сложением кодов технически реализуемой и, значит, позволяет свести выполнение всех арифметических действий к сложению кодов.

Пусть, например, необходимо осуществить операцию вычитания двоичных чисел 0,1110101 и 0,1010101 с помощью операции суммирования кодов. По правилам действий над двоичными числами

Воспользовавшись дополнительным кодом, получим:

_ 0,1110101

0,1010101

0,0100000

Прямой код

Дополнительный код

0,1110101

0,1110101

+

1,1110101

1,0101011

10,0100000

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

0 + 0 = 0 (+ * + = +)

1 + 0 = 1 (+ * - = -)

0 + 1 = 1 (- * + = -)

1 + 1 =10 (- * - = +)