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


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

кто-нибудь может помочь объяснить мне это.

7 59

7 ответов:

ответ дополнение.

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

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

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

дополнение Two не очень сложно, но получение первоначального хорошего представления о том, что такое дополнение two и как и почему оно работает, вероятно, выходит за рамки ответа SO. Начните со статьи Википедии или google термин для большего количества ресурсов.

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

дополнение двойки работает следующим образом;

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

00000000 означает 0

11111111 означает 255

однако, если бы числа были представлены таким образом, мы не могли бы различать, является ли число положительным или отрицательным. По этой причине бит на левой стороне дает нам эту информацию. Если бит на левой стороне -0, вы можете начать добавлять значение других битов на в верхней части zero. Если бит 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.

Как отметил Джеймс в своем комментарии, это потому, что так работает дополнение two.

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

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

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

Это хорошо
+|0001001
1/0001001
это отрицательно
-|0001001
0/0001001
как байт короткий отрицательный это
-000000011111111
0000000011111111

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

таким образом, диапазон от -2^7 отрицательных (-128) до 2^7 -1 положительных(127)

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

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