是否将字节转换为int是因为java语言规则还是因为jvm?

byte a = 1; byte b = 1; byte c = a + b; 

抛出错误:可能丧失精度

 byte subt = a_s - a_b; ^ required: byte found: int 

这种行为是否与jvm或java语言定义有关。

编辑:如果它是在java语言中定义,那么是否因为记住jvm?

意思是如果java支持byte数据types那么为什么operation on byte结果int

如果Java支持字节数据types,那么为什么操作字节结果int

因为这就是Java虚拟机的devise。 没有指令集来执行字节types的操作。 而inttypes的指令集用于booleanbytecharshort型的操作。

从JVM规范 – 第2.11.1节 :

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

这一点背后的原因也在该部分中具体说明:

鉴于Java虚拟机的单字节操作码大小 ,将编码types转换为操作码会给其指令集的devise带来压力。 如果每种types的指令都支持所有的Java虚拟机的运行时数据types,那么将会有比在一个byte表示更多的指令。 单独的指令可用于根据需要在不支持和受支持的数据types之间进行转换。

有关所有指令集可用于各种types的详细信息,请参阅该部分的表格。

还有一个表格指定了实际types到JVM计算types的映射:

编译器正在做正确的事情。 因为(a + b)可以超出可以保存在字节variables中的最大值。 如果你告诉编译器a,b值不会通过使用'最终'关键字改变它不会再抱怨。

 final byte a = 1; final byte b = 1; byte c = a + b; 

JLS 5.6.2:二进制数字推广涵盖了它:

应用扩展原始转换(§5.1.2)来转换以下规则中指定的一个或两个操作数:

  • 如果其中一个操作数的types是double ,另一个则转换为double

  • 否则,如果任一操作数的types为float ,则另一个操作数转换为float

  • 否则,如果任一操作数的types是long ,则另一个操作数转换为long

  • 否则,两个操作数都转换为inttypes。

是的,这是语言规范。

加(+)运算符。 而添加, 'a'转换(隐式转换)为inttypes,以及types为int 。 因此result是隐式的inttypes。

-操作员也一样。