Сложение двоичных чисел
Вы можете складывать двоичные числа тем же способом, что и десятичные: путём переноса любого избытка из одного столбца в следующий. Например, при сложении десятичных значений 7 и 9 надо перенести 1 в позицию десятков, что обеспечит получение правильного результата – 16. Аналогично, при сложении двоичных значений 1 и 1 Вы должны перенести 1 в позицию “двоек”, что обеспечит правильный результат – 10.
Сложение чисел, записанных многими битами, несколько сложнее, поскольку при этом учитывается перенос из предыдущего столбца. Например, при выполнении следующей операции происходит два переноса:
1 |
0 |
1 |
1 |
+ |
|
1 |
1 |
1 |
1 |
1 |
0 |
Сложение в крайнем правом столбце (1+1) даёт результат 0 и перенос 1 во второй столбец. С учётом этого переноса, сложение во втором столбце (1+1+1) даёт результат 1 и перенос 1 в третий столбец.
Общие правила двоичного сложения показаны в следующей таблице:
Исходные данные |
Результат | |||
Операнд 1 |
Операнд 2 |
Перенос |
Сумма |
Перенос |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
0 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
Представление числа со знаком
До сих пор мы обсуждали двоичное представление чисел без знака. Как уже упоминалось, у чисел без знака каждый бит имеет вес, зависящий от его позиции. Крайний правый (или младший) бит имеет вес 1, а каждый следующий бит имеет вес, вдвое больший, чем предшествующий ему бит. Следовательно, если все восемь бит байта равны нулю, то байт имеет значение 0; если они равны 1, то байт имеет значение 255.
Однако вычисления могут содержать как положительные, так и отрицательные значения, другими словами, числа со знаком. Если байт содержит число со знаком, то его значение представляется только младшими семью битами (0 – 6); старший бит (бит 7) указывает знак числа. Знаковый бит равен 0, если число положительно или равно 0, и 1, если оно отрицательно. На рис. 1.1 показано размещение битов в байтах со знаком и без знака.
Рис. 1. Представление чисел со знаком и без знака
Если байт содержит числа со знаком, то он может представлять положительные значения от 0 (двоичное значение 00000000) до +127 (двоичное значение 01111111) и отрицательные значения от –1 (двоичное значение 11111111) до –128 (двоичное значение 10000000).
Дополнительный код
Почему –1 представляется в двоичном виде как 11111111, а не как 10000001? Дело в том, что отрицательные числа со знаком представляются в дополнительном коде (в форме дополнения до 2). Учёные-программисты ввели дополнительный код, чтобы нуль не имел два различных представления: все нули (“положительный нуль”) и все нули с 1 в позиции знака (“отрицательный нуль”).
Чтобы найти двоичное представление отрицательного числа (т.е. его дополнительный код), надо просто взять его положительную форму, обратить каждый бит (т.е. заменить 0 на 1, а 1 на 0), а затем добавить к полученному результату 1.
Следующий пример показывает, как вычислить двоичное представление числа –32 в дополнительном коде:
00100000 |
+32 |
11011111 |
(обратить каждый бит) |
+ 1 |
(добавить 1) |
11100000 |
(дополнительный код) |
Конечно, использование дополнительного кода приводит к тому, что отрицательное число становится трудно расшифровать. К счастью, только что описанной процедурой можно воспользоваться и для того, чтобы получить положительную форму отрицательного числа (записанного в дополнительном коде). Например, чтобы узнать, какое значение имеет число 11010000, сделайте следующее:
00101111 |
(обратить каждый бит) |
+ 1 |
(добавить 1) |
00110000 |
(=16+32=48) |
Компилятор языка ассемблера позволяет Вам вводить числа в десятичном виде (со знаком и без знака) и автоматически выполняет все преобразования. Однако иногда Вам может понадобиться интерпретировать отрицательное число, содержащееся в памяти или в регистре, поэтому не мешает знать, как самим выполнить эти преобразования.
Хотя двоичная система и обеспечивает точное представление чисел в памяти, тем не менее, с последовательностью из одних нулей и единиц трудно работать. Кроме того, возрастает вероятность совершить ошибку, поскольку при наборе числа вида 10110101 чрезвычайно легко сделать опечатку.