Найти в Дзене

Машинное представление целых чисел со знаком. Прямой, обратный и дополнительный код.

В этой статье я постарался максимально коротко, подробно и внятно(с картиночками). В конце статьи вас ждёт мой краткий алгоритм по поиску все трёх способов изложения информации (кодов). Представим число 99 в двоичной системе. Полная разрядная сетка(1 байт) состоит из 8 разрядов(8 бит). Byte = 8 bit Число 1100011 двоичной системы состоит из 7 разрядов. По одной цифре на ячейку. В случае, когда компьютеру нужно сохранить число без знака(положительное), он заполнит разрядную сетку недостающими нулями. (То есть, если бы число состояло из 6 разрядов мы бы дописали 2 нуля для заполнения разрядной сетки). Но что если мы дадим компьютеру число -99? Для этой задачи и существует прямой, обратный и дополнительный код. В случае прямого кодирования компьютер возьмёт ту же разрядную сетку (представлена выше), но первой ячейке(биту) придаст значение "знакового бита". Как можно было уже понять из прошлого примера: "0" в ячейке знакового бита означает "+", а "1" означает "-". Прямой код двоичной сист

В этой статье я постарался максимально коротко, подробно и внятно(с картиночками). В конце статьи вас ждёт мой краткий алгоритм по поиску все трёх способов изложения информации (кодов).

Представим число 99 в двоичной системе.

Полная разрядная сетка(1 байт) состоит из 8 разрядов(8 бит).

Byte = 8 bit

Число 1100011 двоичной системы состоит из 7 разрядов. По одной цифре на ячейку. В случае, когда компьютеру нужно сохранить число без знака(положительное), он заполнит разрядную сетку недостающими нулями. (То есть, если бы число состояло из 6 разрядов мы бы дописали 2 нуля для заполнения разрядной сетки).

Машинное представление числа 99 в двоичной системе без знака.
Машинное представление числа 99 в двоичной системе без знака.

Но что если мы дадим компьютеру число -99?

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

В случае прямого кодирования компьютер возьмёт ту же разрядную сетку (представлена выше), но первой ячейке(биту) придаст значение "знакового бита". Как можно было уже понять из прошлого примера: "0" в ячейке знакового бита означает "+", а "1" означает "-".

-3

Прямой код двоичной системы числа -99 будет выглядеть как 11100011 (=-1100011)

Обратный код является инверсией прямого кода, но с сохранением знакового бита(!)

-4

И имеем мы число 10011100 - и оно так же обозначает -99.

И так наша разрядная сетка позволяет нам выразить числа от -127 до 127. Так уж устроен компьютер что -0 и (+)0 для него - разные числа. И чтобы освободить машину от лишней информации и нас от операции вычитания был придуман дополнительный код.

Дополнительный код мы получаем путём добавления единицы к обратному коду.

-5

Дополнительный код облегчает компьютеру представление чисел со знаком, а нас освобождает от сложной операции вычитания. Докажем:

-6

Так как до этого мы заполнили разрядную сетку лидирующими нулями, сейчас 1 находится за пределами нашего регистра. Результат: 0.

Этим уроком мы разобрались в устройстве прямого, обратного, дополнительного кода, как его получить и для чего он нужен. Как и обещал, мой алгоритм получения кода:

Если из ниже прочитанного вам что-то непонятно или вы столкнулись с неизвестным вам термином, попробуйте перечитать статью.

Прямой код:
  1. Перевести число в двоичную систему исчисления.
  2. Заполнить разрядную сетку лидирующими нулями.
  3. Присвоить лидирующей ячейке разрядной сетки значение знакового бита. ("0" = "+" | "1" = "-").
Обратный код:
  1. Добиться получения прямого кода.
  2. Подвергнуть инверсии значение каждой ячейки за исключением знакового бита(его оставить неизменным).
Дополнительный код:
  1. Добиться получения обратного кода.
  2. Прибавить единицу к обратному коду числа.

Глоссарий:

Разрядная сетка — это кол-во двоичных разрядов, выделяемых в памяти для отображения чисел. Она напрямую зависит от разрядности процессора. Если число вышло за пределы разрядной сетки слева, то говорят о переполнении разрядной сетки. Если справа – то о возникновении машинного нуля.

Ячейка памяти — основной строительный блок памяти компьютера. Ячейка памяти представляет собой электронную схему, которая хранит один бит двоичной информации.

Знаковый бит — бит, который показывает знак числа: положительное число (нуль) или отрицательное число (единица).

Система счисления — способ записи (представления) чисел.

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

Обратный код — метод вычислительной математики, позволяющий вычесть одно число из другого, используя только операцию сложения над натуральными числами.

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