# 为什么 short 相加会自动提升为 int?

Java 中进行二元与运算类型的提升规则

整数运算:

如果两个操作数有一个为 long,则结果也为 long;

没有 long 时,结果为 int,即使操作数全为 short,byte,结果也是 int。

浮点数运算:

如果两个操作数有一个为 double,则结果为 double;

只有两个操作数都是 float,则结果才是 float。

注意:int 与 float 运算,结果为 float。

为什么两个 short 类型相加会自动提升为 int?

image-20230618093102338

s1+s2 系统会自动将它们提升为 int 再运算,结果为 int 类型,赋给 short 类型,编译报错;s3 = s2 + 1 也是同样的原因;s3 = 4 + 45,系统先计算 4 + 45 = 50,也就是变为 s3 = 50,50 在 short 表示的范围内自动转型为 short,但是为什么 java 在两个 short 型运算时自动提升为 int,即使它们没有超过表示范围?

image-20230618093321379

使用较小类型运算没有性能优势,消除较小的类型使得字节码更简单,并且使得具有未来扩展空间的完整指令集仍然适合单个字节码中的操作码,因此,较小的类型通常被视为 Java 设计中的二等公民,在各个步骤转换为 int,因为这简化了一些事情。

Why does the Java API use int instead of short or byte?

为什么 Java API 使用 int 而不是 short 或 byte?

image-20230618093548011

image-20230618093559929

答案可能只与 Java 虚拟机指令集有关。较小的类型 (byte,short) 基本上只用于数组。

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。

为较小的类型引入专用的算术逻辑单元不值得付出努力:它需要额外的晶体管,但它仍然只能在一个时钟周期内执行一次加法。 JVM 设计时的主流架构是 32 位,适合 32 位 int。