输入促销Java

Eur*_*oco 4 java casting

我正在用Herbert Schildt的书来学习Java: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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么我必须在行中使用(byte):

b = (byte) (b * b);     // cast needed!!
Run Code Online (Sandbox Code Playgroud)

b被定义为一个字节,b*b的结果是100,这是一个字节的正确值(-128 ... 127).

谢谢.

dav*_*ave 7

JLS(5.6.2.二进制数字促销)给出了关于将数值类型与二元运算符组合的规则,例如乘法运算符(*):

  • 如果任一操作数的类型为double,则另一个操作数将转换为double.
  • 否则,如果其中一个操作数的类型为float,则另一个操作数将转换为float.
  • 否则,如果其中一个操作数的类型为long,则另一个操作数将转换为long.
  • 否则,两个操作数都将转换为int.

最后一点适用于您的情况,字节转换为整数然后相乘.