Представление положительных и отрицательных чисел в памяти компьютера. Прямой и дополнительный код числа

Раздел: 
Информатика как наука

Прямой код

Прямой код – это представление числа в двоичной системе счисления, при котором первый (старший) разряд отводится под знак числа. Если число положительное, то в левый разряд записывается 0; если число отрицательное, то в левый разряд записывается 1.

Таким образом, в двоичной системе счисления, используя прямой код, в восьмиразрядной ячейке (байте) можно записать семиразрядное число. Например:

0 0001101 – положительное число
1 0001101 – отрицательное число

Количество значений, которые можно поместить в семиразрядной ячейке со знаком в дополнительном разряде равно 256. Это совпадает с количеством значений, которые можно поместить в восьмиразрядную ячейку без указания знака. Однако диапазон значений уже другой, ему принадлежат значения от -128 до 127 включительно (при переводе в десятичную систему счисления).

При этом в вычислительной технике прямой код используется почти исключительно для представления положительных чисел.

Для отрицательных чисел используется так называемый дополнительный код. Это связано с удобством выполнения операций над числами электронными устройствами компьютера.

Дополнительный код

В дополнительном коде, также как и прямом, первый разряд отводится для представления знака числа. Прямой код используется для представления положительных чисел, а дополнительный – для представления отрицательных. Поэтому, если в первом разряде находится 1, то мы имеем дело с дополнительным кодом и с отрицательным числом.

Все остальные разряды числа в дополнительном коде сначала инвертируются, т.е. заменяются противоположными (0 на 1, а 1 на 0). Например, если 1 0001100 – это прямой код числа, то при формировании его дополнительного кода, сначала надо заменить нули на единицы, а единицы на нули, кроме первого разряда. Получаем 1 1110011. Но это еще не окончательный вид дополнительного кода числа.

Далее следует прибавить единицу к получившемуся инверсией числу:

1 1110011 + 1 = 1 1110100

В итоге и получается число, которое принято называть дополнительным кодом числа.

Причина, по которой используется дополнительный код числа для представления отрицательных чисел, связана с тем, что так проще выполнять математические операции. Например, у нас два числа, представленных в прямом коде. Одно число положительное, другое – отрицательное и эти числа нужно сложить. Однако просто сложить их нельзя. Сначала компьютер должен определить, что это за числа. Выяснив, что одно число отрицательное, ему следует заменить операцию сложения операцией вычитания. Потом, машина должна определить, какое число больше по модулю, чтобы выяснить знак результата и определиться с тем, что из чего вычитать. В итоге, получается сложный алгоритм. Куда проще складывать числа, если отрицательные преобразованы в дополнительный код. Это можно увидеть на примерах ниже.

Операция сложения положительного числа и отрицательного числа, представленного в прямом коде

  1. Прямой код числа 5: 0 000 0101
    Прямой код числа -7: 1 000 0111
  2. Два исходных числа сравниваются. В разряд знака результата записывается знак большего исходного числа.
  3. Если числа имеют разные знаки, то вместо операции сложения используется операция вычитания из большего по модулю значения меньшего. При этом первый (знаковый) разряд в операции не участвует.
    _ 000 0111
      000 0101
    -------------
      000 0010
    
  4. После выполнения операции учитывается первый разряд. Результат операции 1 000 0010, или -210.

Операция сложения положительного числа и отрицательного числа, представленного в дополнительном коде

  1. Прямой код числа 5: 0 000 0101
    Прямой код числа -7: 1 000 0111
  2. Формирование дополнительного кода числа -7.
    Прямой код : 1 000 0111
    Инверсия : 1 111 1000
    Добавление единицы: 1 111 1001
  3. Операция сложения.
      0 000 0101
    + 1 111 1001
      --------------
      1 111 1110
    
  4. Проверка результата путем преобразования к прямому коду.
    Дополнительный код: 1 111 1110
    Вычитание единицы : 1 111 1101
    Инверсия : 1 000 0010 (или -210)

А подскажите с чем это

А подскажите с чем это связано, что для образования дополнительного кода к инверсии нужно добавлять (собственно поэтому он наверное и называется "дополнительным кодом"), а потом отнимать единицу, почему бы не воспользоваться просто инверсии для представления отрицательного числа.

Недопонял. Если в прямом коде

Недопонял. Если в прямом коде 0 000 0000 - равно десятичному 0, тогда
1 000 0000 должно быть -1;
1 111 1111 это -128
0 111 1111 это 127
Тогда почему в примере 1 000 0111 равно -7, если это получается -8???

Недопонимание

"Количество значений, которые можно поместить в семиразрядной ячейке со знаком в дополнительном разряде равно 256." - почему в этом предложении говорится о семиразрядной ячейки, если в нём же сказано, что знак помещается в дополнительном разряде? Во вторых я не совсем согласен с тем, что диапазон от -128 до 127, правильней было от -127 до 0 и от него до 127, ведь не может же ячейка памяти принять значение равное 128, если восьмой (старший) разряд выделен для знака.

Зато может принять значение

Зато может принять значение -128

да не может она принять этого

да не может она принять этого значения....формула интервала значений -2^n-1 +1 или же +2^n-1 +1 получаем значение от -127 до 127 ( и того 254 результата ) + еще 2 результата ( -0 и +0) т.к 0 в таком коде бывает положительный и отрицательный и получаем 256 результатов!!!

"Однако диапазон значений уже

"Однако диапазон значений уже другой, ему принадлежат значения от -128 до 127 включительно (при переводе в десятичную систему счисления)." так все-таки включает он в себя -128 или нет? Внесите ясность!

включается. 128 отрицательных

включается. 128 отрицательных значений и 128 положительных, т.е. отрицательные от -128 до -1 включительно и положительные от 0 до 127, учитывая что 0 относят к положительным числам.