因为Java语言规范是这样说的。第5.6.1节定义了用于撤消某些运算符的一元数值提升,并指出:
- 如果操作数的编译时类型为byte,short或char,则通过扩展基元转换(第5.1.2节)将其提升为int类型的值。
关于二进制数值运算符(“ binary”表示具有两个操作数,如“ +”的运算符)的评估的第5.6.2节说类似的话:
- 如果一个操作数的类型为double,则另一个将转换为double。
- 否则,如果其中一个操作数的类型为float,则另一个将转换为float。
- 否则,如果其中一个操作数的类型为long,则另一个将转换为long。
- 否则,两个操作数都将转换为int类型。
为什么这样定义?主要原因是在设计Java语言和Java虚拟机时,计算机的标准字长为32位,而使用较小类型的基本算术在性能上没有优势。通过将32位用作int大小,然后在Java字节码中提供专用指令,Java虚拟机被设计为利用此优势。用于使用整数,长整数,浮点数和双精度数的算术运算,但不适用于任何较小的数字类型(字节,短数和字符)。消除较小的类型可使字节码更简单,并使完整的指令集(还有将来的扩展空间)仍将操作码放在单个字节中。同样,JVM的设计偏向于在32位系统上轻松实现,在类和堆栈中的数据布局中,其中64位类型(双精度和长整数)占用两个插槽,而所有其他类型(32-位或更小)占用一个插槽。
因此,较小的类型通常在Java设计中被视为二等公民,并在各个步骤将其转换为int,因为这简化了某些事情。较小的类型仍然很重要,因为它们打包在一起时(例如,以数组形式)占用较少的内存,但是在计算表达式时却无济于事。
| 归档时间: |
|
| 查看次数: |
2613 次 |
| 最近记录: |