一些原因已经被指出。例如,事实
“…(Almost) All operations on byte, short will promote these primitives to int”.然而,明显的下一个问题是:为什么这些类型提升为int?
所以要走得更深一层:答案可能只是与Java虚拟机指令集相关。如在Table in the Java Virtual Machine Specification中所概述的,所有积分算术运算,例如加法,除法和其他,仅可用于类型int和类型long,而不适用于较小类型。
(an aside:较小的类型(字节和短)基本上只用于数组,像new byte [1000]这样的数组将占用1000字节,像new int [1000]这样的数组需要4000字节)
现在,当然,可以说“…明显的下一个问题是:为什么这些指令只提供int(和长)?”。
一个原因在上面提到的JVM规范中提到:
If each typed instruction supported all of the Java Virtual Machine’s run-time data types, there would be more instructions than could be represented in a byte
另外,Java虚拟机可以被认为是真实处理器的抽象。而对于较小型号引入专用Arithmetic Logic Unit将不值得努力:它将需要额外的晶体管,但它仍然只能在一个时钟周期中执行一次加法。设计JVM时的主要架构是32位,刚好适合32位int。 (涉及64位长的值的操作被实现为特殊情况)。
(注意:最后一段有点过于简单,考虑可能的矢量化等,但应该给出基本的想法,而不必深入处理器设计主题)
编辑:一个简短的附录,集中在问题的例子,但在更一般的意义:还可以问,使用较小的类型存储字段是否会是有益的。例如,人们可能认为通过将Calendar.DAY_OF_WEEK存储为字节可以节省内存。但这里,Java类文件格式发挥作用:所有Fields in a Class File占用至少一个“slot”,其大小为一个int(32位)。 (“宽”字段,双长和长,占用两个槽)。所以显式声明一个字段为short或byte不会保存任何内存。