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