我正在学习Java与Herbert Schildt的书:Java初学者指南。 在那本书中出现了这段代码:
// A promotion surprise!
class PromDemo{
public static void main(String args[]){
byte b;
int i;
b = 10;
i = b * b; // OK, no cast needed
b = 10;
b = (byte) (b * b); // cast needed!!
System.out.println("i and b: " + i + " " + b);
}
}
我不明白为什么我必须在行中使用(byte):
b = (byte) (b * b); // cast needed!!
b被定义为一个字节,b * b的结果是100,这是一个字节的正确值(-128 ... 127)。
谢谢。
答案 0 :(得分:7)
JLS(5.6.2. Binary Numeric Promotion)给出了关于将数值类型与二元运算符组合的规则,例如乘法运算符(*
):
- 如果其中一个操作数的类型为double,则另一个操作数将转换为double。
- 否则,如果其中一个操作数的类型为float,则另一个操作数将转换为float。
- 否则,如果其中一个操作数的类型为long,则另一个操作数将转换为long。
- 否则,两个操作数都将转换为int。
最后一点适用于您的情况,字节转换为整数然后相乘。
答案 1 :(得分:3)
在Java中,当您进行如下计算时,byte和short将始终提升为int:
sheet2
所以你实际上将一个整数乘以一个整数,它将返回一个整数。由于无法为字节分配整数,因此需要强制转换。
如果你想谷歌它(称为https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2)
,这称为“自动类型推广”