Отрицательные числа в компьютере
Компьютеру приходится иметь дело не только с положительными, но и с отрицательными числами. Они могут находиться и среди исходных данных задачи, и получаться в процессе ее решения. Для запоминания знака числа в его двоичном представлении выделяется самый старший разряд ячейки памяти (байта, слова или двоичного слова).
Разработчики первых ЭВМ со знаком числа распорядились просто: для положительных чисел в знаковый разряд записывается нуль, а для отрицательных – единицу. Такой способ представления двоичных чисел получил название прямого кода:
00 0 0 0 0 0 0 0 0 0 0 1 1 | – число +3 |
Однако он оказался не очень удачным, т. к. такие простые и часто используемые операции, как сложение/вычитание, машине иногда приходилось выполнять в два этапа. Это ведь человек видит, какое слагаемое больше по абсолютной величине, когда ему приходится вычитать 7 из 2. А машина «сообразит» об этом только после неудачной попытки произвести заем из несуществующих разрядов. После этого она произведет обратное вычитание (2 из 7) и сменит у результата знак. И такие два действия вместо одного машине приходилось делать ровно в 25% всевозможных сочетаний знаков и абсолютных величин слагаемых.
В поисках более эффективных решений сначала был предложен обратный код для хранения отрицательных чисел, в котором все разряды числа заменялись на противоположные:
00 0 0 0 0 0 0 0 0 0 0 1 1 | число -3 |
В обратном коде придумывались хитроумные способы сложения, в которых знаковый разряд принимал участие в операции таким же образом, как и все остальные. Однако возникавший при этом перенос из знакового разряда добавлялся к младшему разряду суммы.
Наконец, был придуман дополнительный код, который получался из обратного кода отрицательного числа путем прибавления к нему единицы в младший разряд:
1 1 1 1 1 1 1 1 1 1 1 1 0 0 | число -3 обратный код | |
1 1 1 1 1 1 1 1 1 1 1 1 0 1 | число -3 дополнительный код |
Примеры:
Число | Двоичный код | Прямой код | Обратный код | Дополнительный код |
-1 | -1 | |||
-17 | -10001 | |||
-70 | -1000110 |
Свое название дополнительный код получил из-за того, что сумма k-разрядного положительного двоичного числа + N со своей отрицательной парой –N дает . В этом нетрудно убедиться. Сложите двоичное положительное число + N с двоичным эквивалентом –N в обратном коде. В каждом разряде суммы получится 1, т. к. соответствующие разряды чисел + N и –N всегда противоположны. А теперь добавьте к двоичному коду из k единиц недостающую единицу в младший разряд, то получится .
Таким образом, в дополнительном коде числа + N и –N дополняют друг друга до соответствующей степени двойки.
Операция сложения в дополнительном коде всегда выполняется за один такт. При этом знаковые разряды складываются, как и все остальные, а перенос из них игнорируется.
Как видите, игра стоит свеч. Только за счет выбора хитроумного кода удалось на 25% повысить выполнения арифметических операций, не вложив практически никаких затрат в аппаратуру.
Контрольные вопросы:
1. В чем отличие позиционной системы счисления от непозиционной?
2. Каковы способы перевода чисел из одной системы счисления в другую?
3. В чем заключается преимущество использования восьмеричной и шестнадцатеричной систем счисления в вычислительной технике?
4. Выполнить перевод из одной системы счисления в другую:
7358 = ?10 ; 11011,0112 = ?10 ; 34710 = ?2 ; 23,4816 = ?10 ; 358 = ?10 ;
351,34310 =?2 ; 1010010112=?16 ;10111000112=?8 ; 0,4510=?2 ; 5F16=?8
АЛГОРИТМИЗАЦИЯ И ПРОГРАММИРОВАНИЕ