Представление положительных и отрицательных чисел в памяти компьютера. Прямой и дополнительный код числа
Прямой двоичный код числа
Прямой код – это представление числа в двоичной системе счисления, при котором старший разряд отводится под знак числа. Если число положительное, то в левый разряд записывается 0; если число отрицательное, то в левый разряд записывается 1.
Таким образом, в двоичной системе счисления, используя прямой код, в восьмиразрядной ячейке (байте) можно записать семиразрядное число. Например:
0 0001101
– положительное число
1 0001101
– отрицательное число
Количество значений, которые можно поместить в семиразрядной ячейке со знаком в восьмом разряде, равно 256. Это совпадает с количеством значений, которые можно поместить в восьмиразрядную ячейку без указания знака. Однако диапазон значений уже другой – от -128 до 127 включительно (при переводе в десятичную систему счисления).
При этом в вычислительной технике прямой код используется почти исключительно для представления положительных чисел.
Дополнительный двоичный код числа
Для представления отрицательных чисел в вычислительной технике используется так называемый дополнительный код. Это связано с удобством выполнения операций над числами электронными устройствами компьютера.
В дополнительном коде, так же как и прямом, старший разряд отводится для представления знака числа. Поэтому, если в восьмом разряде находится 1, то мы имеем дело с дополнительным кодом и с отрицательным числом.
Дополнительный двоичный код числа получают из прямого путем следующих преобразований. Все разряды числа, кроме старшего, сначала инвертируются, т.е. заменяются противоположными (0 на 1, а 1 на 0). Например, если 1 0001100
– это прямой код числа, то при формировании его обратного кода, сначала надо заменить нули на единицы, а единицы на нули, кроме старшего разряда. Получаем 1 1110011
. Но это еще не окончательный вид дополнительного кода числа.
Далее к получившемуся обратному числу следует прибавить единицу:
1 1110011 + 1 = 1 1110100
В итоге получится дополнительный код числа.
Причина, по которой используется дополнительный код числа для представления отрицательных чисел, связана с тем, что так проще выполнять математические операции. Например, у нас два числа, представленных в прямом коде. Одно число положительное, другое – отрицательное и эти числа нужно сложить. Однако просто сложить их нельзя. Сначала компьютер должен определить, что это за числа. Выяснив, что одно число отрицательное, ему следует заменить операцию сложения операцией вычитания. Потом, машина должна определить, какое число больше по модулю, чтобы выяснить знак результата и определиться с тем, что из чего вычитать. В итоге, получается относительно сложный алгоритм. ЭВМ устроены так, что им куда проще складывать числа, если отрицательные преобразованы в дополнительный код. Это можно увидеть на примерах ниже.
Операция сложения положительного числа и представленного в прямом коде отрицательного
- Прямой код числа 5:
0 000 0101
Прямой код числа -7:1 000 0111
- Два исходных числа сравниваются. В разряд знака результата записывается знак большего исходного числа.
- Если числа имеют разные знаки, то вместо операции сложения используется операция вычитания из большего по модулю значения меньшего. При этом первый (знаковый) разряд в операции не участвует.
_ 000 0111 000 0101 ------------- 000 0010
- После выполнения операции учитывается первый разряд. Результат операции
1 000 0010
, или -210.
Операция сложения положительного числа и представленного в дополнительном коде отрицательного
- Прямой код числа 5:
0 000 0101
Прямой код числа -7:1 000 0111
- Формирование дополнительного кода числа -7.
Прямой код: 1 000 0111 Инверсия: 1 111 1000 Добавление единицы: 1 111 1001
- Операция сложения.
0 000 0101 + 1 111 1001 -------------- 1 111 1110
- Проверка результата путем преобразования к прямому коду.
Дополнительный код: 1 111 1110 Вычитание единицы: 1 111 1101 Инверсия: 1 000 0010 (или -210)