乘以两个字节

时间:2015-05-11 18:18:49

标签: java byte

有人可以解释一下我为什么不能以这种方式将两个字节相乘?

byte a = 1;
byte b = 1;
byte c = a*b;

byte a = 1;
byte b = 1;
short c = a*b;

为什么我必须这样做?

byte a = 1;
byte b = 1;
byte c = (byte)(a*b);

byte a = 1;
byte b = 1;
int/double/float/long c = a*b;

2 个答案:

答案 0 :(得分:10)

使用byte执行数学运算时,会发生二进制数字促销,由JLS, Section 5.6.2指定。

  

当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示可转换为数字类型的值,以下规则适用:

     
      
  1. 如果任何操作数属于引用类型,则进行拆箱转换(第5.1.8节)。

  2.   
  3. 应用扩展基元转换(第5.1.2节)来转换由以下规则指定的一个或两个操作数:

         
        
    • 如果任一操作数的类型为double,则另一个操作数转换为double。

    •   
    • 否则,如果任一操作数的类型为float,则另一个操作数转换为float。

    •   
    • 否则,如果任一操作数的类型为long,则另一个操作数转换为long。

    •   
    • 否则,两个操作数都转换为int

    •   
  4.   

(强调我的)

这会强制您指定一个至少与int一样宽的类型,或者转回byte

答案 1 :(得分:0)

两个字节的乘积不一定适合一个字节。因此,Java需要您告诉它您知道自己在做什么,并确认在溢出的情况下您将获得低位。