原始数据类型

Java 有 8 种原始数据类型,即 booleanbyteshortcharintlongfloatdouble。 (所有其他类型都是引用类型。这包括所有数组类型,以及在 Java 语言中具有特殊意义的内置对象类型/类;例如 StringClassThrowable 及其子类。)

原始类型的所有操作(加法,减法,乘法等)的结果至少是 int,因此将 short 添加到 short 会产生 int,就像将 byte 添加到 byte,或者将 char 添加到 byte,或者将 char 添加到 char 。如果要将其结果分配回相同类型的值,则必须强制转换它。例如

byte a = 1;
byte b = 2;
byte c = (byte) (a + b);

不转换操作将导致编译错误。

这是由于 Java 语言规范的以下部分,§2.11.1

编译器使用 Java 虚拟机指令对 byteshort 类型的文字值进行编码,这些指令在编译时或运行时将这些值签名扩展为 int 类型的值。booleanchar 类型的文字值的加载使用在编译时或运行时将文字零扩展为 int 类型的指令进行编码。 [..]。因此,对实际类型 booleanbytecharshort 的值的大多数操作都是通过对计算类型 int 的值进行操作的指令正确执行的。

其背后的原因也在该部分中说明:

鉴于 Java 虚拟机的单字节操作码大小,将编码类型编码到操作码中会对其指令集的设计造成压力。如果每个类型化指令都支持所有 Java 虚拟机的运行时数据类型,则会有更多的指令,而不是在 byte 中表示的。 […]单独的指令可用于根据需要在不支持和支持的数据类型之间进行转换。