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”数据类型,那么为什么“对byte进行操作”的结果是“int”?
byte a = 1;
byte b = 1;
byte c = a + b;
引发错误:可能会丢失精度
byte subt = a_s - a_b;
^
required: byte
found: int
这种行为是否与JVM有关,或者它是在Java语言中定义的?int
类型的指令集用于执行boolean
、byte
、char
和short
类型的操作。byte
和short
类型的大量字面值进行编码,以在编译时或运行时将这些值符号扩展为int
类型的值。使用指令将boolean
和char
类型的大量字面值编码为在编译时或运行时将该字面值零扩展为int
类型的值。因此,对于实际类型为boolean
、byte
、char
和short
的值的大多数操作都是通过操作计算类型为int
的值的指令正确执行的。byte
。可以使用单独的指令在必要时在不受支持的数据类型和受支持的数据类型之间进行转换。
要了解各种类型可用的所有指令集的详细信息,您可以查看该部分中的表格。
还有一张表格指定了实际类型与JVM计算类型之间的映射:
int
,执行操作,然后再将它们转换回 byte
,对吧?JLS 规范似乎更适用,尽管这可能解释了 JLS 中的那部分原因。 - Bernhard BarkerJLS 5.6.2: 二进制数值提升 对此进行了解释:
使用扩展原始类型转换(§5.1.2)将操作数转换为指定类型,具体规则如下:
如果其中一个操作数是
double
类型,则另一个操作数将被转换为double
类型。否则,如果其中一个操作数是
float
类型,则另一个操作数将被转换为float
类型。否则,如果其中一个操作数是
long
类型,则另一个操作数将被转换为long
类型。否则,两个操作数都将被转换为
int
类型。
编译器正在做正确的事情。这是因为 (a + b) 的值可能超出 byte 变量所能表示的最大值。如果您使用“final”关键字告诉编译器 a、b 值不会改变,那么它将不再报错。
final byte a = 1;
final byte b = 1;
byte c = a + b;
编译器是正确的,要么将变量声明为final,要么转换为byte类型:
byte b = 1;
byte c = 22;
byte a = (byte) (b + c);
JAVA: byte+byte = int
:)
是的,这是语言规范。
加法(+)运算符。在相加时,'a'
被隐式转换为 int
类型,b 也被转换为 int
类型。因此,result
隐式地成为 int
类型。
-
运算符同理。
在对任何操作数进行算术运算时,结果以此形式存储:MAX(int,operand1 type,operand2 type,...operandN type)
例如:
byte a=10;
byte b=20;
byte c=a+b;
那么a+b的结果将以MAX(int,operand1 type,operand2 type,...operandN type)的形式存储, 在这种情况下 MAX(int,byte,byte)最大值是int,因此c将具有int值,但c已声明为byte,我们无法将int(较大)值存储到byte(较小)中。每个算术运算符都适用于相同的规则。
这就是为什么错误会说 error: incompatible types: possible lossy conversion from int to byte