为什么java xor位运算符导致整数而不是其操作数的类型?

时间:2018-04-27 18:52:12

标签: java

如果我编译它:

 1      public class test {
 2          public static void main (String args[]) {
 3              byte bx = 1;
 4              byte by = 2;
 5
 6              int iz = bx ^ by;
 7              byte bz = bx ^ by;
 8              byte cbz = (byte)(bx ^ by);
 9          }
10      }

然后我收到了这个错误:

test.java:7: error: incompatible types: possible lossy conversion from int to byte
                bz = bx ^ by;

这导致我做了一个简短的journey,导致我决定^总是在按位上下文中产生int。我不明白为什么选择这个。

起初我认为它可能与装箱(或拆箱)有关,但我使用的是原始类型,因此我认为这不是我困惑的一部分。

我唯一能想到的是字节被提升为int但我还没有找到任何说明发生的事情。

1 个答案:

答案 0 :(得分:3)

因为在Java中,所有数字运算符会将操作数提升为intlongfloatdouble,如JLS 5.6.2. Binary Numeric Promotion

  

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

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

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

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

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

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

    •   
    • 否则,两个操作数都将转换为int类型。

    •   
  4.         

    在类型转换后,如果有的话,将值集转换(第5.1.13节)应用于每个操作数。

         

    对某些运算符的操作数执行二进制数字提升:

         
        
    • 乘法运算符*/%(第15.17节)

    •   
    • 数值类型+-(第15.18.2节)的加法和减法运算符

    •   
    • 数字比较运算符<<=>>=(§15.20.1)

    •   
    • 数字相等运算符==!=(§15.21.1)

    •   
    • 整数按位运算符&^|(第15.22.1节)

    •   
    • 在某些情况下,条件运算符? :(第15.25节)

    •