Сложение и вычитание
Практически все арифметические операции в компьютере сводятся к операции сложения.
Разберем все возможные случаи, используя 2 числа: A и B. Заметим, что все операции сложения чаще всего ведутся в обратных кодах. Напомним, что у положительного числа все коды одинаковы.
Основные принципы сложения в двоичной системе счисления:
При сложении в столбик применяются те же правила, что и при сложении десятичных чисел.
Сложение в обратных кодах
Случай 1. A и B -- положительные числа.
При сложении таких чисел просто суммируются их обратные коды (для положительных чисел они равны прямым), включая знаковый разряд. Т.к. знаковый разряд у положительных чисел равен 0, то у суммы он также равен 0, таким образом, число также будет положительным.
Рисунок 1.
Случай 2. A -- положительное, B -- отрицательное, по модулю больше A.
В этом случае числа A и B (для отрицательного числа берется обратный код) просто складываются и получается результат в обратном коде:
Рисунок 2.
Для перевода результата в прямой код биты цифровой части инвертируются: 1000 1010=−10.
Случай 3. A -- положительное, B -- отрицательное, по модулю меньше A.
Если в этом случае поступить таким же образом, то получим ошибку расчета. Компьютер решает эту проблему переносом получившейся «лишней единицы» из знакового разряда в младший разряд получившейся суммы. Не забываем для отрицательного числа A записать обратный код:
Рисунок 3.
Случай 4. A и B -- отрицательные.
В этом случае во избежание ошибки снова нужно будет перенести единицу из знакового разряда в младший разряд числа.
Рисунок 4.
При сложении чисел возможен вариант переполнения, когда полученный результат не помещается в выделенное для него место в памяти.
Самый надежный способ проверки не произошло ли переполнение -- проверка знака результата. Если он получается не таким, какой должен быть, значит произошло переполнение.
Максимально возможное значение по модулю для чисел со знаком равно 2n−1, где n -- количество бит для хранения числа.
Например, если на хранение числа отводится 1 байт, то максимально возможное значение по модулю 28−1=27=128. Если число по модулю получается больше, то для операции необходимо выделить больше памяти.
Заметим, что переполнение возможно в случае, когда числа имеют одинаковый знак (оба положительны или оба отрицательны).
Случай 5. Переполнение, когда A и B -- положительные.
Рисунок 5.
Мы получили в результате сложения двух положительных чисел -- отрицательное. Т.е. произошло переполнение. Ситуация решается расширением диапазона:
Рисунок 6.
Случай 6. Переполнение, когда A и B -- отрицательные.
Ситуация такая же, как и в случае 5. Решается тем же способом -- расширением диапазона.
Рисунок 7.
Сложение в дополнительных кодах
Случай 1. A и B -- положительные.
Стандартный случай, т.к. у положительных чисел прямой, обратный и дополнительный коды совпадают.
Случай 2. A -- положительное, B -- отрицательное, по модулю больше A.
В случае использования дополнительных кодов получим сразу правильный результат, в отличие от сложения обратных кодов.
Случай 3. A -- положительное, B -- отрицательное, по модулю меньше A.
В отличие от сложения обратных кодов, где нужно было прибавлять «лишнюю» единицу к полученному коду, в этом случае нужно ее просто отбросить.
Рисунок 8.
Случай 4. A и B -- отрицательные.
В этом случае тоже отбрасываем «лишнюю» единицу.
Рисунок 9.
Случай 5 и 6. Переполнение -- аналогично обратному.
При необходимости выполнения вычитания чисел, оно сводится к сложению отрицательных чисел. Например, A−B=A+(−B).
Умножение
Т.к. умножение - сложная операция, то специально для нее в компьютере имеется регистр (накапливающий сумматор) и с помощью последовательности сдвигов и сложений получается результат.
Умножение в двоичной системе выполняется быстрее, чем сложение и вычитание, т.к. сложение можно производить в прямом коде.
Для определения знака результата умножения над знаковыми разрядами совершается операция сложения по модулю («строгое (исключающее) ИЛИ» или «XOR»).
Умножим числа −13 и 23:
Рисунок 10.
Для удобства умножения нули между знаковым разрядом и первой цифрой числа за писывать не будем.
Полученный результат содержит 10 цифр. Приведем его к виду из 16 бит, добавив нули между знаковым разрядом и модулем числа:
1000 0001 0010 1011.
Деление
Деление для компьютера является трудной операцией. Обычно оно реализуется путем многократного прибавления к делимому дополнительного кода делителя.
Рассматривая операцию деления, как и в случае деления десятичных чисел, необходимо выделить 3 варианта выполнения деления:
-
деление без остатка;
-
деление с остатком;
-
деление с заданной точностью.