С логической точки зрения:
Bounds в подписанном представлении
У вас есть 5 битов, поэтому существует 32 различных комбинаций. Это означает, что вы можете сделать 32 разных номера с 5 битами. В целых числах без знака имеет смысл хранить целые числа от 0 до 31 (включительно) на 5 бит.
Однако речь идет о целых числах без знака. Смысл: мы должны найти способ представления отрицательных чисел. Значение: нам нужно сохранить значение числа, но также его знак (+ или -). Используемое представление является дополнением 2, и это тот, который изучается повсюду (может быть, другие существуют, но я их не знаю). В этом представлении знак задается первым битом. То есть, в представлении комплемента 2 положительное число начинается с 0, а отрицательное число начинается с 1.
И вот проблема встает: есть 0 положительное число или отрицательное число? Это не может быть так, потому что это означает, что 0 может быть представлено двумя способами для заданного числа бит (для 5: 00000 и 10000), то есть мы теряем пространство, чтобы поставить еще одно число. Я понятия не имею, как они решили, но факт 0 - это положительное число. Для любого количества бит, подписанных или без знака, a 0 представляется только 0.
Отлично. Это дает нам ответ на первый вопрос: какова верхняя граница десятичного числа, представленного в дополнении 2? Мы знаем, что первый бит для знака, поэтому все числа, которые мы можем представить, должны состоять из 4 бит. Мы можем иметь 16 различных значений 4-битовых строк, а 0 - один из них, поэтому верхняя граница равна 15.
Теперь, для отрицательных чисел это становится легко. Мы уже заполнили 16 значений из 32, которые мы можем сделать на 5 бит. 16 слева. Мы также знаем, что 0 уже представлено, поэтому нам не нужно его включать. Затем мы начинаем с числа перед 0: -1. Поскольку у нас есть 16 чисел для представления, начиная с -1, наименьшее знаковое целое число, которое мы можем представить на 5 бит, равно -16.
В целом, с n
битами мы можем представить 2^n
номеров. Со знаком целых чисел половина из них положительна, а половина из них отрицательна. То есть у нас есть 2^(n-1)
положительных чисел и 2^(n-1)
отрицательные числа. Как мы знаем, 0 считается положительным, наибольшее целое число со знаком, мы можем представить на n
битов 2^(n-1) - 1
и самая низкая -2^(n-1)
2 дополнением представление
Теперь, когда мы знаем, какие числа могут быть представлены на 5 бит, вопрос состоит в том, чтобы знать, как мы их представляем.
Мы уже видели, что знак представлен на первом бите и что 0 считается положительным. Для положительных чисел он работает так же, как и для целых чисел без знака: 00000 равен 0, 00001 равен 1, 00010 равен 2 и т. Д. До 01111, что равно 15. Здесь мы останавливаемся на положительные целые числа, потому что мы заняли все 16 значений, которые у нас были.
Для отрицательных целых чисел, это разные. Если мы сохраняем одно и то же представление (10001 равно -1, 10010 равно -2, ...), тогда мы получим 11111, равный -15 и 10000, которые не будут отнесены. Мы могли бы сказать, что это -16, но мы должны были бы проверять этот конкретный случай каждый раз, когда мы работаем с отрицательными целыми числами. Кроме того, это испортит все двоичные операции. Мы могли бы также решить, что 10000 -1, 10001 -2, 10010 - -3 и т. Д. Но это также испортит все двоичные операции.
2 дополняет работу следующим образом. Допустим, у вас есть целое число со знаком 10011, вы хотите знать, что такое десятичное число.
- Раскладные все биты: 10011 -> 01100
- Добавить 1: 01100 -> 01101
- Читай, как целое число без знака: 01101 = 0 * 2^4 + 1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 1 * 2^0 = 13.
10011 представляет -13. Это представление очень удобно, потому что оно работает в обоих направлениях. Как представить -7 как двоичное целое число со знаком? Начните с двоичным представлением 7, который является 00111.
- Флип все биты: 00111 -> 11000
- Добавить 1: 11000 -> 11001
И вот оно! На 5 бит, -7 представлен 11001.
Я не буду его покрывать, но еще одно большое преимущество с дополнением 2 заключается в том, что сложение работает одинаково. То есть, при добавлении двух двоичных чисел вам не нужно заботиться о том, подписаны они или нет, это тот же самый алгоритм.
С этим вы должны быть в состоянии ответить на вопросы, но что еще более важно, чтобы понять ответы.
Эта тема отлично подходит для понимания дополнения до 2: Why is two's complement used to represent negative numbers?
Очень приятно. Предложение «Сдвиг всех бит» можно смутить с помощью операций с левым или правым сдвигом. Возможно, флип, или Википедия использует инвертирование. – foo