是否将字节转换为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的操作。 而int
types的指令集用于boolean
, byte
, char
和short
型的操作。
从JVM规范 – 第2.11.1节 :
编译器使用Java虚拟机指令对
byte
值types为byte
和short
负载进行编码,这些指令在编译时或运行时将这些值签名扩展为int
types的值。 types为boolean
和char
的字面值的负载使用在编译时或运行时将文字零值扩展为int
types的指令进行编码。 [..]。 因此,对于实际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
。否则,两个操作数都转换为
int
types。
是的,这是语言规范。
加(+)运算符。 而添加, 'a'
转换(隐式转换)为int
types,以及types为int
。 因此result
是隐式的int
types。
-
操作员也一样。