Я не понимаю, почему самое низкое значение, которое может принимать байт, -128
. Я вижу, что самое высокое значение - 127
, потому что это 01111111
в двоичном виде, но как представить -128
только с 8 битами, один из которых используется для знака? Положительное число 128 уже будет 8-битным, то есть 10000000
, и тогда вам потребуется 9-й бит для представления отрицательного знака.
Может кто-нибудь, пожалуйста, помогите объяснить это мне.
Ответ: дополнение до двух.
Короче говоря, Java (и большинство современных языков) не представляют целые числа со знаком, используя представление величины со знаком. Другими словами, 8-разрядное целое число не является знаковым битом, за которым следует 7-разрядное целое число без знака.
Вместо этого отрицательные целые числа представляются в системе, называемой дополнением до двух, что упрощает аппаратную арифметическую обработку, а также устраняет потенциальную неоднозначность наличия положительного нуля и отрицательного нуля. Побочным эффектом исключения отрицательного нуля является то, что всегда есть одно дополнительное отрицательное число, доступное внизу диапазона.
Другое интересное свойство систем с дополнением до двух состоит в том, что первый бит действительно эффективно функционирует как индикатор знака (т. е. все числа, начинающиеся с бита 1, отрицательны), но следующие семь битов не должны быть интерпретируются сами по себе как число без знака, к которому применяется бит знака.
Дополнение до двух не очень сложно, но получение начального хорошего представления о том, что такое дополнение до двух и как и почему оно работает, вероятно, выходит за рамки SO-ответа. Начните со статьи в Википедии или погуглите термин, чтобы найти дополнительные ресурсы.
Чтобы попытаться кратко ответить на ваш вопрос о -128, основная идея генерации числа в дополнении до двух состоит в том, чтобы взять беззнаковую форму числа, инвертировать все биты и добавить единицу. Таким образом, число 128 без знака равно 10000000. В перевернутом виде получается 01111111, и добавление единицы снова дает 10000000. Таким образом, в системе с дополнением до двух 10000000 однозначно равно -128, а не +128.Числа больше или равные +128 просто не могут быть представлены в 8 битах с использованием системы дополнения до двух, потому что они будут неоднозначными с формами отрицательных чисел.