我想知道在评估表达式或处理按位操作时,byte
和short
值被提升为int
的原因是什么?
答案 0 :(得分:5)
因为Java语言规范是这样说的。 Section 5.6.1为某些运营商的评估定义了一元数字促销,它说:
- 如果操作数是编译时类型byte,short或char,则通过扩展原语转换(第5.1.2节)将其提升为int类型的值。
Section 5.6.2关于二进制数值运算符的评估('binary'意味着有两个操作数的运算符,比如'+')表示类似的东西:
- 如果任一操作数的类型为double,则另一个操作数将转换为double。
- 否则,如果任一操作数的类型为float,则另一个操作数转换为float。
- 否则,如果任一操作数的类型为long,则另一个操作数将转换为long。
- 否则,两个操作数都将转换为int。
为什么这样定义?一个主要原因是在设计Java语言和Java虚拟机时,32位是计算机的标准字大小,其中使用较小类型进行基本算术没有性能优势。 Java虚拟机旨在利用这一点,通过使用32位作为int大小,然后在the Java bytecode中提供专用指令,用于int,long,float和double的算术,但不包括任何较小的数字类型(byte,short和char)。消除较小的类型使得字节码更简单,并且使得具有未来扩展空间的完整指令集仍然适合单个字节中的操作码。类似地,JVM的设计倾向于在32位系统上轻松实现,在类和堆栈中的数据布局中,64位类型(双精度和长整数)占用两个插槽和所有其他类型(32-位或更小)占一个位置。
因此,较小的类型在Java的设计中通常被视为二等公民,在各个步骤转换为int,因为这简化了一些事情。较小的类型仍然很重要,因为它们在打包在一起时占用较少的内存(例如,在数组中),但在评估表达式时它们没有帮助。