2014-12-20 1 views
2

Я хотел бы знать, почему значения byte и short присваиваются значениям int всякий раз, когда выражение оценивается или обрабатывается побитовая операция?Почему байтовые и короткие значения повышаются до int при оценке выражения

+1

Оба, если они не мой вопрос –

+3

Вы правы - это не так. Но принятый ответ на второй содержит действительно хорошее обсуждение вашего вопроса. –

+0

Для меня это не тот ответ, которого я хочу вообще. Я хочу, чтобы причина компилятора заключалась в стиле автоматического продвижения во время оценки предиката и/или в поразрядной логике, если это возможно, сравнение того, что делает другой том. Я добрался до безумия по поводу poeple, потому что я больше склоняюсь к downvote, чем к помощи. HAving -2 для хорошего ответа ... –

ответ

2

Потому что спецификация языка 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 на разных этапах, потому что это упростило некоторые вещи. Меньшие типы по-прежнему важны, потому что они уменьшают объем памяти при сборке (например, в массивах), но при оценке выражений они не помогают.

 Смежные вопросы

  • Нет связанных вопросов^_^