Лекция: Алгебраическое представление двоичных чисел
Знак числа обычно кодируется двоичной цифрой: знак "+" кодируется 0, знак "-" кодируется 1. Если двоичные числа —45 и 31 в форме с запятой, фиксированной после нулевого разряда, сложить, то получим неверный результат 1100.1100 или в десятичной системе счисления -45+31 =-76 (10101101+00011111=11001100). Чтобы арифметические операции над знаковыми числами в ЭВМ можно было бы производить точно также, как и с беззнаковыми переменными, отрицательные числа представляются в дополнительном коде.
Следует упомянуть, что aльтepнaтивнымиявляютcя представления в прямом и обратном коде.
Прямой код числа N – = -(abs(N). Такой код и был использован в рассмотренном выше примере. Недостатки такого представления:
— операцию вычитания нельзя заменить операцией сложения;
— представление числа 0 неоднозначно.
Обратный код числа получается инверсией двоичных разрядов. Через а обозначим двоичный разряд числа, а через а* - инверсию двоичного разряда (если а=1, то а*=0 и если а=0, то а*=1). Правило получения обратного кода:
если N>0, то = 0aaaaaaa;
если N<0, то =1 а* а* а* а* а* а* а* а*,
если N=0, то имеет место неоднозначность или .
Например, число 11 в обратном коде представляется как 0.1011, а число с=-7 будет представлено как 1.1000. Сложим эти числа:
0.1011+1.1000= 0.0011+ единица переноса из старшего разряда.
Если единицу пересоса из старшего разряда игнорировать, то результат сложения неверный: 11-7=3. Чтобы получить верный результат, необходимо единицу переноса добавить к младшему разряду результата: 0.1011+1.1000=0.0011+0.0001=0.0100 (11-7=4).
Следовательно,
— представление 0 в обратном коде неоднозначно;
— операцию вычитания можно заменить операцией сложения, однако, если в результате выполнения операции будет получен перенос из старшего (знакового) разряда, эту 1 необходимо добавить к младшему разряду результата, чтобы получилось правильное значение. Такая корректировка результата может привести к увеличению времени сложения за счет распространения циклического переноса.
В дополнительном коде положительное число представляется также, как в прямом и обратном кодах, т.е. при N>0, = 0aaaaaaa.
Чтобы получить дополнительный код отрицательного числа:
1) надо взять его положительную форму (взять прямой код положительного числа);
2) обратить каждый бит (иначе говоря, заменить в представлении числа 0 на 1 и 1 на 0);
3) добавить к полученному числу 1 младшего разряда. Например, представим в дополнительном коде число-32:
1) положительная форма числа –0.00100000;
2) обратим биты –1.11011111;
3) добавим 1 —1.11011111 +0.00000001
получим 1.11100000 — дополнительный код числа.
Достоинства такого кода заключается в том, что нуль однозначно представляется кодом 0,0000....0 и, кроме того, операцию вычитания можно заменить операцией сложения. Достоинство по сравнению с обратным кодом состоит в отсутствии циклического переноса, перенос из знакового разряда просто отбрасывается (игнорируется).
Недостаток такого представления — при использовании дополнительного кода отрицательное число становится трудно расшифровать. Однако дело облегчается тем, что положительную форму отрицательного числа в дополнительном коде можно получить аналогично вышеописанной методике, выполнив пункты 2 и 3. Проверим на рассмотренном выше примере:
2) обращаем биты 000011111;
3) добавляем 1 + 0.00000001 получим 0.00100000.
Хочу отметить еще одно положительное свойство дополнительного кода: четность-нечетность или другие признаки деления двоичного дополнительного кода числа совпадают с признаками у прямого кода.