为什么在计算表达式时将byte和short值提升为int

我想知道每当计算表达式或处理逐位操作时, byteshort值都被提升为int的原因是什么?

因为Java语言规范是这样说的。 第5.6.1节定义了用于评估某些运营商的一元数字促销,它说:

  • 如果操作数是编译时类型byte,short或char,则通过扩展原语转换(第5.1.2节)将其提升为int类型的值。

关于二进制数值运算符的评估的第5.6.2节 (’binary’表示具有两个操作数的运算符,如’+’)表示类似的东西:

  • 如果任一操作数的类型为double,则另一个操作数转换为double。
  • 否则,如果任一操作数的类型为float,则另一个操作数转换为float。
  • 否则,如果任一操作数的类型为long,则另一个操作数转换为long。
  • 否则,两个操作数都将转换为int类型。

为什么这样定义? 一个主要原因是,在设计Java语言和Java虚拟机时,32位是计算机的标准字大小,其中使用较小类型进行基本算术没有性能优势。 Java虚拟机旨在利用这一点,通过使用32位作为int大小,然后在Java字节码中提供专用指令,用于使用整数,长整数,浮点数和双精度数,但不能与任何较小的数字类型(byte,short和char)。 消除较小的类型使得字节码更简单,并且使得具有未来扩展空间的完整指令集仍然适合单个字节中的操作码。 类似地,JVM的设计倾向于在32位系统上轻松实现,在类和堆栈中的数据布局中,64位类型(双精度和长整数)占用两个插槽和所有其他类型(32-位或更小)占一个槽。

因此,较小的类型通常在Java的设计中被视为二等公民,在各个步骤转换为int,因为这简化了一些事情。 较小的类型仍然很重要,因为它们在打包在一起时占用较少的内存(例如,在数组中),但在评估表达式时它们没有帮助。