Один из способов думать об этом заключается в том, что подписанный формат дополнения до двух работает, присваивая каждому биту степень двойки, а затем переворачивая знак последней степени двух.Например, давайте посмотрим на -4, который представлен как 100. Это означает, что значение равно
-1 x 2^2 + 0 x 2^1 + 0 x 2^0
. Если мы хотим получить положительную версию этого значения, мы должны отрицать его доget
1 x 2^2 - 0 x 2^1 - 0 x 2^0
Обратите внимание, что это значение равно
1 x 2^2 + 0 x 2^1 + 0 x 2^0
Другими словами, нормальное двоичное представление этого значения равно 100. Однако у нас возникли проблемы, посколькумы используем представление дополнения со знаком два, что означает, что мы специально зарезервировали бит 4 как бит знака.Следовательно, когда мы пытаемся интерпретировать битовую комбинацию 100 как знаковое, трехразрядное значение дополнения до двух, оно возвращается идентично тому, с чего мы начали.Здесь больно нехватка битов.
В более общем смысле, учитывая n битов, из которых первый является знаковым битом в представлении дополнения до двух, попытка вычислить -1000 ... 00 вернет то же самоезначение, потому что бит, необходимый для хранения большого положительного значения, имеет специальное значение, присвоенное ему.
Так зачем вообще это делать?Причина этого заключается в том, что, если у вас есть только n битов, вы не можете сохранить значения от -2 n - 1 до 2 n - 1 , поскольку существует 2 n *Здесь 1019 * + 1 разных чисел и только 2 ^ n разных битовых комбинаций.Исключение наибольшего положительного числа, таким образом, позволяет хранить все различные числа в указанном битовом массиве.
Но почему отбрасывается высокое значение, а не низкое значение?Это для того, чтобы сохранить двоичную совместимость с целыми числами без знака.В целых числах без знака значения от 0 до 2 n-1 - 1 все кодируются с использованием стандартного представления base-two.Следовательно, чтобы целые числа без знака и со знаком были согласованы вообще, целые числа без знака сконструированы таким образом, чтобы они были побитовым эквивалентом первых 2 n - 1 целых чисел без знака, которые варьируются от 0 до 2 n - 1 - 1 включительно.После этого беззнаковые значения нуждаются в старшем значащем бите для кодирования чисел, но знаковые значения используют его как знаковый бит.
Надеюсь, это поможет!