Подтвердить что ты не робот

Почему диапазон байтов от -128 до 127 в Java?

Я не понимаю, почему наименьшее значение, которое может принимать байты, это -128. Я вижу, что самое высокое значение 127, потому что оно 01111111 в двоичном формате, но как представить -128 всего 8 бит, один из которых используется для знака? Положительный 128 уже будет 8-битным, т.е. 10000000, а затем вам понадобится 9-й бит для представления отрицательного знака.

Разве кто-то может помочь мне объяснить это.

4b9b3361

Ответ 1

Ответ два дополнения.

Короче говоря, Java (и большинство современных языков) не представляют собой целые числа со знаком с использованием знака с знаковой величиной. Другими словами, 8-разрядное целое число не является знаковым битом, за которым следует 7-разрядное целое число без знака.

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

Еще одно интересное свойство двух систем дополнений состоит в том, что первый бит эффективно функционирует как индикаторный знак (т.е. все числа, начинающиеся с бита 1, являются отрицательными), но следующие семь битов не должны интерпретироваться как без знака, к которому применяется знаковый бит.

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

Чтобы попытаться кратко описать ваш запрос о -128, фундаментальная идея создания двоичного числа - это принять неподписанную форму числа, инвертировать все биты и добавить один. Таким образом, unsigned 128 равен 10000000. Перевернутый, он 01111111, и добавление снова получает 10000000. Таким образом, в двухкомпонентной системе 10000000 недвусмысленно -128, а не +128. Числа, большие или равные +128, просто не могут быть представлены в 8 битах с использованием двух систем дополнения, поскольку они будут неоднозначными с формами отрицательных чисел.

Ответ 2

Как отметил Джеймс в своем комментарии, это объясняется тем, как работают два дополнения.

Если мы поместим его в другие выражения, вы можете представить 2 ^ 8 = 256 видов значений. который в этом случае используется как 128 отрицательных чисел, 127 положительных чисел и нуль. Если бы мы использовали 7 бит для представления значения, +1 бит для знака, мы могли бы представить одно меньшее значение и также имели бы два нуля (что было бы очень неудачно, так как сравнение двух значений было бы более сложным из-за этого).

Ответ 3

В дополнение к ответам здесь я могу объяснить, как работают два дополнения.

Байт состоит из 8 бит.

00000000 означает 0

11111111 означает 255

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

Примеры

В этих примерах бит с левой стороны равен 1, это означает, что мы добавляем значения других бит в верхней части -128.

10000000 = -128 (-128 + 0)

10000001 = -127 (-128 + 1)

10000011 = -125 (-128 + 3)

10000111 = -121 (-128 + 7)

Одинаковые байты, но на этот раз бит слева равен 0. Это означает, что мы начинаем добавлять в начало 0.

00000000 = 0 (0 + 0)

00000001 = 1 (0 + 1)

00000011 = 3 (0 + 3)

00000111 = 7 (0 + 7)

Если мы до сих пор в порядке, ответ на ваш вопрос, наименьшее возможное число с 8 битами с этим правилом:

10000000 = -128

наибольшее возможное количество

011111111 = 127

Вот почему диапазон находится между -128 и 127.

Ответ 4

Базовые числовые типы могут представлять 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 все еще сохраняется.

Ответ 5

в java все переменные, такие как byte short int long float double, записываются как подписанные. так что очень просто, бит главы всегда указывает, что (отрицательное или положительное), а потому, что числа делятся на 2 половины сдвинуты как отрицательные, 0 по умолчанию положительно. поэтому он выглядит так:

это положительно + | 0001001
1 | 0001001
это отрицательно
- | 0001001
0 | 0001001
как байт короткий отрицательный - -000000011111111
0000000011111111

Ответ 6

байт состоит из 8 бит --- > 1 бит знака (положительный или отрицательный) 7-битное значение

поэтому диапазон -2 ^ 7 отрицательный (-128) до 2 ^ 7 -1 положительный (127)

Ответ 7

Не попадая в два дополнения: 2 ^ 8 (так как байт имеет 8 цифр и может иметь 1 из 2 значений) = 256, поэтому самые индивидуальные значения, которые может представлять байт, составляют 256. поэтому, представляя числа от -128 до -1, половина нашего диапазона. Я считаю, что здесь возникает вопрос о том, почему максимальное положительное значение 127, а не 128. Это потому, что мы должны представлять число 0, поэтому включительно 0-127 - это другие 128 возможностей нашего диапазона.

Если бы мы допустили только положительные значения, например, беззнаковый байт, где отрицательные числа невозможен, диапазон будет 0-255, так как это 256 различных значений (включая 0).