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

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

Может кто-нибудь, пожалуйста, помогите объяснить это мне.

65
задан wattostudios 2 May 2012 в 06:52
поделиться

1 ответ

Ответ: дополнение до двух.

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

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

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

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

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

78
ответ дан 24 November 2019 в 15:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: