java - Java中的类型提升
问题描述
我对以下 Java 语句有疑问:
byte b = 10;
byte r = (byte) (b * b); // Giving correct result
byte r = (byte) b * b; // Giving error " POSSIBLE LOSS OF PRECISION"
为什么必须给括号加括号b * b
?
解决方案
(byte) b * b
将 first 的值转换b
为byte
(这是多余的,因为它已经是byte
),并将其乘以 second 的值b
。byte
将两个s相乘会将它们提升为int
第一个,因为 s 没有*
运算符byte
。因此结果是int
,并且不能分配给byte
变量。
另一方面,(byte)(b * b)
将int
乘法结果转换为byte
,可以将其分配给byte
变量。
当运算符将二进制数值提升应用于一对操作数时,每个操作数都必须表示一个可转换为数值类型的值,以下规则按顺序适用:
如果任何操作数属于引用类型,则将对其进行拆箱转换(第 5.1.8 节)。
加宽原语转换(第 5.1.2 节)适用于转换以下规则指定的一个或两个操作数:
如果任一操作数是 double 类型,则另一个操作数将转换为 double。
否则,如果任一操作数的类型为浮点型,则另一个将转换为浮点型。
否则,如果任一操作数是 long 类型,则另一个将转换为 long。
否则,两个操作数都转换为 int 类型。