是否将字节转换为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的指令集用于boolean , byte , char和short型的操作。 
从JVM规范 – 第2.11.1节 :
编译器使用Java虚拟机指令对
byte值types为byte和short负载进行编码,这些指令在编译时或运行时将这些值签名扩展为inttypes的值。 types为boolean和char的字面值的负载使用在编译时或运行时将文字零值扩展为inttypes的指令进行编码。 [..]。 因此,对于实际typesboolean,byte,char和short值的大多数操作都是通过对计算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。 
  -操作员也一样。