如果我编译它:
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但我还没有找到任何说明发生的事情。
答案 0 :(得分:3)
因为在Java中,所有数字运算符会将操作数提升为int
,long
,float
或double
,如JLS 5.6.2. Binary Numeric Promotion:
当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示可转换为数字类型的值,以下规则适用:
如果任何操作数属于引用类型,则进行拆箱转换(第5.1.8节)。
- 醇>
应用扩展基元转换(第5.1.2节)来转换由以下规则指定的一个或两个操作数:
如果任一操作数的类型为
double
,则另一个操作数将转换为double
。否则,如果任一操作数的类型为
float
,则另一个操作数将转换为float
。否则,如果任一操作数的类型为
long
,则另一个操作数将转换为long
。否则,两个操作数都将转换为
int
类型。在类型转换后,如果有的话,将值集转换(第5.1.13节)应用于每个操作数。
对某些运算符的操作数执行二进制数字提升:
乘法运算符
*
,/
和%
(第15.17节)数值类型
+
和-
(第15.18.2节)的加法和减法运算符数字比较运算符
<
,<=
,>
和>=
(§15.20.1)数字相等运算符
==
和!=
(§15.21.1)整数按位运算符
&
,^
和|
(第15.22.1节)在某些情况下,条件运算符
? :
(第15.25节)