Ответ - дополнение двух .
Короче говоря, Java (и большинство современных языков) не представляют собой целые числа со знаком с объявлением с знаковой величиной. Другими словами, 8-разрядное целое число не является знаковым битом, за которым следует 7-разрядное целое число без знака.
Вместо этого отрицательные целые числа представлены в системе, называемой двумя дополнениями, что позволяет упростить арифметическую обработку в аппаратном обеспечении, а также устраняет потенциальную двусмысленность наличия положительного нуля и отрицательного нуля. Побочным эффектом устранения отрицательного нуля является то, что в нижней части диапазона всегда имеется одно дополнительное отрицательное число.
Еще одно интересное свойство систем дополнений двух состоит в том, что первый бит эффективно работает в качестве индикатора знака (т. е. все числа, начинающиеся с бит 1, являются отрицательными), но следующие семь биты не должны быть интерпретированы сами по себе как беззнаковое число, к которому применяется битовый знак.
Дополнение от 2 не является ужасно сложным, но получает первоначальное хорошее сцепление с тем, что является дополнением и как и почему он работает, вероятно, выходит за рамки SO-ответа. Начните с статьи в Википедии, или в google термин для получения дополнительных ресурсов.
Чтобы попытаться кратко рассмотреть ваш запрос о -128, основная идея создания двоичного номера второго заключается в том, чтобы принять неподписанную форму номера , инвертируйте все биты и добавьте один. Таким образом, unsigned 128 - 10000000. Перевернутый, это 01111111, и добавление снова получает 10000000. Таким образом, в системе дополнений двух, 10000000 недвусмысленно -128, а не +128. Числа, большие или равные +128, просто не могут быть представлены в 8 битах с использованием системы комплемента двух, потому что они будут неоднозначными с формами отрицательных чисел.
Дополнение 2 работает следующим образом:
Байт состоит из 8 бит.
00000000 означает 0
11111111 означает 255
blockquote>Однако, если числа были представлены так, мы не могли бы различать, является ли число положительным или отрицательным. По этой причине бит с левой стороны дает нам эту информацию. Если бит с левой стороны
0
, вы можете начать добавлять значение других бит в верхней частиzero
. Если бит1
, вы должны начать добавлять вверху-128
. Поскольку бит на левой стороне равен двум параметрам в семь.Примеры;
В этих примерах бит с левой стороны равен 1, это означает, что мы добавляем значения других бит в верхней части -128.
10000000 = -128 (-128 + 0)
10000001 = -127 (-128 + 1)
10000011 = -125 (-128 + 3)
10000111 = -121 (-128 + 7)
blockquote>Одинаковые байты, но на этот раз бит слева -
0
. Это означает, что мы начинаем добавлять вверху0
.00000000 = 0 (0 + 0)
00000001 = 1 (0 + 1)
00000011 = 3 (0 + 3)
00000111 = 7 (0 + 7)
blockquote>Если мы до сих пор в порядке, ответ на ваш вопрос, наименьшее возможное число с 8 бит с этим правилом:
10000000 = -128
blockquote>наибольшее возможное число
011111111 = 127
blockquote>Вот почему диапазон находится между -128 и 127.
в java все переменные, такие как byte short int long float double, записываются как подписанные. так что очень просто, бит главы всегда указывает, что (отрицательное или положительное), а потому, что числа делятся на 2 половины сдвинуты как отрицательные, 0 по умолчанию положительно. поэтому это выглядит так:
это положительно + | 0001001 1 | 0001001 это отрицательно - | 0001001 0 | 0001001 в качестве короткого байта отрицательный -000000011111111 0000000011111111
Не попадая в два дополнения: 2 ^ 8 (так как байт имеет 8 цифр и может иметь 1 из 2 значений) = 256, поэтому самые индивидуальные значения, которые может представлять байт, составляют 256. Таким образом, представляя числа от -128 до -1 - половина нашего диапазона. Я считаю, что здесь вопрос заключается в том, почему максимальное положительное значение 127, а не 128. Это потому, что мы должны представлять число 0, поэтому включительно 0-127 - это другие 128 возможностей нашего диапазона.
Если мы допустили только положительные значения, такие как беззнаковый байт, где отрицательные числа невозможен, диапазон будет 0-255, так как это 256 различных значений (включая 0).
байт состоит из 8 бит ---> 1 бит знака (положительный или отрицательный) 7-битное значение
, поэтому диапазон -2 ^ 7 отрицательный (-128) до 2 ^ 7 -1 положительный ( 127)
Базовые числовые типы могут представлять 2 ^ n чисел. Посмотрите на случай n = 2. Вы можете представить четыре случая, давайте назовем их a, b, c, d. Тогда вы можете согласиться либо на a=-2, b=-1, c=0, d=1
(это принято), либо a=-1, b=0, c=1, d=2
(возможно, но не используется). Итак, если у вас есть только один нуль и удерживайте 2 ^ n состояния, ваш abs(min) != max
Увеличение n
перемещает границы, но abs(min) != max
все еще сохраняется.
Как отметил Джеймс в своем комментарии, это потому, что так работает дополнение двух.
Если мы выразим другие слова, вы можете представить 2 ^ 8 = 256 видов значений. который в этом случае используется как 128 отрицательных чисел, 127 положительных чисел и нуль. Если мы использовали 7 бит для представления значения, +1 бит для знака, мы могли бы представить одно меньшее значение и также имели бы два нуля (что было бы очень неудачно, так как сравнение двух значений было бы более сложным из-за этого).