Java 为什么在计算表达式时字节和短值被提升为int

Java 为什么在计算表达式时字节和短值被提升为int,java,type-promotion,Java,Type Promotion,我想知道,每当计算表达式或处理逐位运算时,byte和short值被提升为int的原因是什么?,因为Java语言规范这么说。定义用于计算某些运算符的一元数字提升,并说明: 如果操作数是编译时类型byte、short或char,则通过扩大原语转换(§5.1.2)将其提升为int类型的值 关于二进制数字运算符的求值(“binary”表示有两个操作数的运算符,如“+”)表示类似的内容: 如果其中一个操作数的类型为double,则另一个操作数将转换为double 否则,如果其中一个操作数的类型为fl

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

,因为Java语言规范这么说。定义用于计算某些运算符的一元数字提升,并说明:

  • 如果操作数是编译时类型byte、short或char,则通过扩大原语转换(§5.1.2)将其提升为int类型的值
关于二进制数字运算符的求值(“binary”表示有两个操作数的运算符,如“+”)表示类似的内容:

  • 如果其中一个操作数的类型为double,则另一个操作数将转换为double
  • 否则,如果其中一个操作数的类型为float,则另一个操作数将转换为float
  • 否则,如果其中一个操作数的类型为long,则另一个操作数将转换为long
  • 否则,两个操作数都将转换为int类型
为什么会这样定义?一个主要原因是,在设计Java语言和Java虚拟机时,32位是计算机的标准字长,使用较小的类型进行基本运算没有性能优势。Java虚拟机就是为了利用这一点而设计的,它使用32位作为int大小,然后在中为int、long、float和double的算术提供专用指令,但不使用任何较小的数字类型(byte、short和char)。消除较小的类型会使字节码更简单,并使完整的指令集(具有将来扩展的空间)仍能在单个字节中容纳操作码。类似地,JVM的设计倾向于在32位系统上轻松实现,在类和堆栈中的数据布局中,64位类型(双精度和长精度)占用两个插槽,所有其他类型(32位或更小)占用一个插槽


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

如果它们都不是我的问题,那么你是对的-它们不是。但第二个问题的公认答案对你的问题进行了很好的讨论。对我来说,这根本不是我想要的答案。我想在求值谓词期间和/或在按位逻辑期间自动提升类型背后的编译器原因,如果可能的话,比较其他语言所做的。我有点疯狂,这里的人更倾向于反对而不是帮助。a-2代表一个好答案……你不可能总是得到你想要的。但是如果你有时间尝试,你会发现你得到了你需要的。