Как записать дополнительный код отрицательного числа
Перейти к содержимому

Как записать дополнительный код отрицательного числа

  • автор:

Прямой код и дополнительный код

В этом уроке кратко рассмотрим как хранятся целочисленные числа в памяти компьютера.

Допустим у нас есть тип byte. В одном байте у нас восемь бит. Двоичное представление значения типа byte в памяти будет таким:

Представление типа byte в памяти фото

Старший бит в целых числах со знаком используется для обозначения знака. Для положительных чисел он всегда равен 0. В отрицательных числах старший бит всегда равен 1. Такая запись числа в двоичной системе счисления называется прямой код.

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

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

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

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

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

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

Презентацию с видео можно скачать на Patreon .

  • Пробелы
  • Идентификаторы
  • Правила именования переменных
  • Комментарии
  • Разделители
  • Ключевые слова
  • Примитивные типы данных
  • Тип данных char
  • Типы byte, short, int, long
  • Числа с плавающей точкой
  • Тип данных boolean
  • Литералы
  • Методы
  • Переменные
  • Преобразование и приведение примитивных типов
  • Ввод с клавиатуры
  • Задания

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

Прямой код – это представление числа в двоичной системе счисления, при котором первый (старший) разряд отводится под знак числа. Если число положительное, то в левый разряд записывается 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

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

  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

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

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

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

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

Первое, что может прийти в голову — это отводить старший бит под знак, положим, 1 значит, что число отрицательное, а 0 — положительное. Но в таком случае сложив, например, 3 и -1 мы получим:

000000112 + 100000012 = 100001002 = 13210

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

Логично было бы разделить весь диапазон чисел, доступных нам в восьми разрядах, пополам, чтобы одну половину занимали положительные числа, а вторую обратные к ним по сложению. Возьмем, к примеру, число 3. Попробуем отыскать для него обратное по сложению, то есть такое число, которое при сложении с тройкой даст нам 0. Число 3 в двоичном коде записывается как 00000011. Как же нам с помощью сложения из него получить ноль? Для этого результатом нашего сложения должно быть число 100000000. Так как наше число восьмиразрядное, то самая старшая единичка отбросится, и в наших восьми разрядах мы будем иметь 00000000.

На этом моменте читателю предлагается остановиться и немного подумать, как из 00000011 получить обратное к нему по сложению.

Для того, чтобы из 00000011 получить обратное, нужно для начала инвертировать все его биты (единицу заменить нулем, а ноль — единицей), ибо в таком случае при сложении мы получим 11111111, а затем прибавить единицу, чтобы получить 100000000, чего мы и добивались. Итак, число -3 в дополнительном коде выглядит как 11111101. Очевидно, что подобным образом мы сможем найти обратное число к любому из нашего диапазона 8-битных чисел, ибо мы находимся в кольце классов вычетов по модулю 2 8 (если не в курсах, что такое кольца классов вычетов — забейте). Для того, чтобы запись каждого числа была однозначной, положительными числам считаются все от 00000001 до 01111111, отрицательными — все от 10000000 до 11111111. Иначе бы мы не знали как интерпретировать число, например, 10000101: то ли как 133, то ли как -123. Таким образом, в наши 8 бит мы можем записать числа от -128 до 127.

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

Инвертирование битов числа 10 в Python

  • дополнительный код
  • информатика
  • отрицательные числа
  • знаковые числа
  • signed binary

Прямой, обратный и дополнительный коды

Очень часто в вычислениях должны использоваться не только положительные, но и отрицательные числа.

Число со знаком в вычислительной технике представляется путем представления старшего разряда числа в качестве знакового .

Принято считать, что 0 в знаковом разряде означает знак «плюс» для данного числа, а 1 – знак «минус».

Число со знаком в 8-битной разрядной сетке

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

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

Прямой код представляет собой одинаковое представление значимой части числа для положительных и отрицательных чисел и отличается только знаковым битом. В прямом коде число 0 имеет два представления «+0» и «–0».

Обратный код для положительных чисел имеет тот же вид, что и прямой код, а для отрицательных чисел образуется из прямого кода положительного числа путем инвертирования всех значащих разрядов прямого кода. В обратном коде число 0 также имеет два представления «+0» и «–0».

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

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

Таблица прямого, обратного и дополнительного кода 4-битных чисел. Для наглядности представления всего диапазона чисел примем, что сетка представления чисел 4-разрядная, где старший разряд (3) — знаковый, а 0-2 разряды содержат значение числа.

Число Прямой код Обратный код Дополнительный код
-8 1000
-7 1111 1000 1001
-6 1110 1001 1010
-5 1101 1010 1011
-4 1100 1011 1100
-3 1011 1100 1101
-2 1010 1101 1110
-1 1001 1110 1111
0
0
1000
0000
1111
0000
0000
1 0001 0001 0001
2 0010 0010 0010
3 0011 0011 0011
4 0100 0100 0100
5 0101 0101 0101
6 0110 0110 0110
7 0111 0111 0111

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *