Почему байтовые и короткие значения повышаются до int при оценке выражения

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


person Frederic Nault    schedule 20.12.2014    source источник
comment
Оба, если они не мой вопрос   -  person Frederic Nault    schedule 20.12.2014
comment
Вы правы - их нет. Но принятый ответ на второй содержит действительно хорошее обсуждение вашего вопроса.   -  person Paul Boddington    schedule 20.12.2014
comment
Для меня это не тот ответ, который я вообще хочу. Мне нужна причина, по которой компилятор автоматически продвигает тип во время предиката оценки и / или во время побитовой логики, если возможно, сравнивая то, что делает другой язык, . Я немного злюсь на то, что люди здесь больше работают, чтобы понизить голос, чем помочь. Наличие -2 за хороший ответ...   -  person Frederic Nault    schedule 20.12.2014
comment
Вы не всегда можете получить то, что хотите. Но если вы попробуете когда-нибудь, вы обнаружите, что получаете то, что вам нужно.   -  person Gilbert Le Blanc    schedule 20.12.2014
comment
stackoverflow.com/questions/5662685/   -  person assylias    schedule 20.12.2014
comment
Потому что должно быть какое-то правило, и это простое правило, которое легко запомнить и легко реализовать. В частности, JVM выполняет целочисленную арифметику только в 32- и 64-битных модулях.   -  person Hot Licks    schedule 20.12.2014


Ответы (1)


Потому что так сказано в Спецификации языка Java. Раздел 5.6.1 определяет унарное числовое продвижение для оценки определенных операторов и говорит:

  • Если операнд имеет тип byte, short или char времени компиляции, он повышается до значения типа int посредством расширяющего примитивного преобразования (§5.1.2).

Раздел 5.6.2 при оценке бинарных числовых операторов («бинарные» означают операторы с двумя операндами, например «+»), говорит что-то подобное:

  • Если один из операндов имеет тип double, другой преобразуется в double.
  • В противном случае, если один из операндов имеет тип float, другой преобразуется в float.
  • В противном случае, если один из операндов имеет тип long, другой преобразуется в long.
  • В противном случае оба операнда преобразуются в тип int.

Почему это было определено именно так? Основная причина заключается в том, что во время разработки языка Java и виртуальной машины Java 32-разрядный размер был стандартным размером слова для компьютеров, где нет преимущества в производительности при выполнении базовых арифметических операций с меньшими типами. Виртуальная машина Java была разработана, чтобы воспользоваться этим преимуществом, используя 32-битный размер int, а затем предоставляя специальные инструкции в байт-код Java для арифметических операций с целыми, длинными, плавающими и удвоенными числами, но не с меньшими числовыми типами (byte, short и char). Исключение меньших типов упрощает байт-код и позволяет полному набору инструкций с возможностью расширения в будущем по-прежнему помещать код операции в один байт. Точно так же JVM была разработана с уклоном на простоту реализации на 32-битных системах, в расположении данных в классах и в стеке, где 64-битные типы (double и long) занимают два слота, а все остальные типы (32-битные). бит или меньше) занимают один слот.

Таким образом, меньшие типы обычно рассматривались как объекты второго сорта в дизайне Java, преобразуемые в целые на различных этапах, потому что это упрощало некоторые вещи. Меньшие типы по-прежнему важны, потому что они занимают меньше памяти при объединении (например, в массивах), но они не помогают при вычислении выражений.

person Boann    schedule 20.12.2014