Я хотел бы знать, почему значения byte
и short
присваиваются значениям int
всякий раз, когда выражение оценивается или обрабатывается побитовая операция?Почему байтовые и короткие значения повышаются до int при оценке выражения
ответ
Потому что спецификация языка Java говорит так. Section 5.6.1 определяет унарную числовую акцию для evaulation некоторых операторов, и он говорит:
- Если операнд имеет тип байт во время компиляции, короткие, или полукокса, он повышен до значения типа Int на а расширение примитивного преобразования (§ 5.1.1).
Section 5.6.2 по оценке двоичных числовых операторов («Бинарные» означает операторы, которые имеют два операнда, как «+») говорит что-то подобное:
- Если один из операндов имеет тип двойного , другой конвертируется в двойное.
- В противном случае, если любой из операндов имеет тип float, другой преобразуется в float.
- В противном случае, если один из операндов имеет длинный тип, другой преобразован в длинный.
- В противном случае оба операнда преобразуются в тип int.
Почему именно так? Основная причина заключается в том, что во время проектирования Java-языка и виртуальной машины Java 32-разрядный был стандартным размером слов компьютеров, где нет производительности для выполнения основной арифметики с меньшими типами. Виртуальная машина Java была разработана, чтобы воспользоваться этим, используя 32-разрядный размер int, а затем предоставив выделенные команды в the Java bytecode для арифметики с int, longs, floats и double, но не с любым из меньших числовых типов (байт, короткий и символ). Устранение меньших типов упрощает байт-код и позволяет полному набору инструкций с возможностью дальнейшего расширения по-прежнему соответствовать операционному коду в одном байте. Аналогично, JVM был спроектирован с предубеждением к простой реализации на 32-битных системах, в компоновке данных в классах и в стеке, где 64-битные типы (удваивает и удваивают) занимают два слота и все остальные типы (32- бит или меньше) принимают один слот.
Таким образом, меньшие типы обычно рассматривались как граждане второго сорта в дизайне Java, преобразованные в ints на разных этапах, потому что это упростило некоторые вещи. Меньшие типы по-прежнему важны, потому что они уменьшают объем памяти при сборке (например, в массивах), но при оценке выражений они не помогают.
Оба, если они не мой вопрос –
Вы правы - это не так. Но принятый ответ на второй содержит действительно хорошее обсуждение вашего вопроса. –
Для меня это не тот ответ, которого я хочу вообще. Я хочу, чтобы причина компилятора заключалась в стиле автоматического продвижения во время оценки предиката и/или в поразрядной логике, если это возможно, сравнение того, что делает другой том. Я добрался до безумия по поводу poeple, потому что я больше склоняюсь к downvote, чем к помощи. HAving -2 для хорошего ответа ... –