Дополнение до двух

Путешествие в машину: как целые числа со знаком хранятся в памяти

В компьютере все хранится в битах, так как машина понимает только 0 и 1.

Числа следуют этому правилу и хранятся в двоичном формате. Последовательность 0 и 1, где каждая позиция соответствует степени 2. Обычно числа хранятся в одном или нескольких байтах, байт представляет 8 бит.

В примерах, которые я приведу ниже, я буду использовать 4-битные числа только для ясности, но их можно обобщить на любое большее число. Число 5 в двоичном формате дает 0101.

5 рассматривается как 0 * 2³ + 1 * 2² + 0 * 2 + 1.

Беззнаковые числа

Беззнаковые числа всегда равны 0 или положительны. Если он хранится в 4 битах, то у меня есть 2*2*2*2 = 2⁴ = 16 возможных комбинаций. Затем я могу написать любое целое число от 0 (хранится как 0000) до 15 (хранится как 1111).

Подписанные номера

Что делать, если я хочу сохранить -1 на моем компьютере? На 4 бита? Люди выдвинули разные идеи, все имеют 1 общую основу, это разделяет область возможных значений на 2. Таким образом, вместо перехода от 0 к 15 он будет переходить от -некоторого значения к +другому значению. Вот несколько идей:

0. Сохраните крайний левый бит для знака

Таким образом, я могу записать все числа от -7 (1111) до +7 (0111).

У этого метода есть 2 недостатка, у меня есть 2 возможных значения для 0: 0000 для +0 и 1000 для -0. Затем дополнения не являются прямыми вперед. Если я добавлю 5 + (-5). Делая как обычно, мы получаем 0010 = 2, упс. Следующая идея.

1. Перевернуть число — дополнение до единицы

Другой взгляд, я беру противоположное, переворачивая каждый бит. Я получаю те же минимальное и максимальное значения, и теперь 5 + (-5) = 0. Однако у меня все еще есть 2 значения для 0, и вычитания не очевидны.

2. Дополнение до двух

Эту технику можно свести к 2 этапам:

  1. перевернуть номер
  2. добавить одну

Более подробно: по-прежнему ничего не меняю для хранения положительных чисел. Я работаю только для хранения отрицательных значений. Чтобы перейти от 5 к -5:

Здесь мы видим все возможные значения, которые мы можем получить с помощью 4 бит.

У меня есть только одно значение для 0, так что теперь я могу перейти от -8 до +7. Мы также можем отметить, что для -8 крайний левый бит работает и как индикатор отрицательного знака, и как фактическое двоичное представление для 8.

Вот объяснение того, почему существует только одна комбинация битов для 0 и несколько примеров сложения и вычитания.

Поскольку числа хранятся в 4 битах, любой перенос после этого отбрасывается машиной.

Добавление 3 к 2

Вычитание 4 из 2 равносильно прибавлению -4 к 2.

Требуется небольшая дополнительная работа, так как результат отрицательный, нам нужно взять дополнение до двух, это значение равно 2, поэтому результат -4 +2 = -2 …хорошо…

Вывод

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

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