大佬同学问了我一个Java基础问题,我第一反应就是这不就是9吗,结果她告诉我代码是无法运行的。
byte i =7;
byte j =2 ;
byte k = i+j;
System.out.println(k);
我不服,我把代码粘到IDE里,发现竟然报错。
好吧,现在我服了
IDEA提示需要byte类型而实际上=号右边是int类型,int的范围是要比byte大的,所以直接用是行不通的(原因在后面),必须强制类型转换。
所以我就好奇为啥两个byte类型的变量用+后就变成int类型。
最后,我发现当时正在看的书上就有相关介绍
两个数值进行二元操作时,结果有可能会自动转换类型,分为4中情况:
1.如果两个操作数中有一个是double类型,另一个就会转换为double类型。
比如这段代码
double i =7;
byte j =2 ;
Object k = i+j;
System.out.println("Vaule of k is; "+k+". \nThe type of k is "+k.getClass().toString());
它的运行结果为
Vaule of k is; 9.0.
The type of k is class java.lang.Double
2.否则,如果其中一个操作数是float,另一个操作数就会转换为float类型。
比如这段代码
float i =7;
byte j =2 ;
Object k = i+j;
System.out.println("Vaule of k is; "+k+". \nThe type of k is "+k.getClass().toString());
它的运行结果为
Vaule of k is; 9.0.
The type of k is class java.lang.Float
3.否则,如果其中一个操作数是long,另一个操作数就会转换为long类型。
比如这段代码
long i =7;
byte j =2 ;
Object k = i+j;
System.out.println("Vaule of k is; "+k+". \nThe type of k is "+k.getClass().toString());
它的运行结果为
Vaule of k is; 9.
The type of k is class java.lang.Long
4.否则,两个操作数都将被转换为int类型。
比如这段代码
byte i =7;
byte j =2 ;
Object k = i+j;
System.out.println("Vaule of k is; "+k+". \nThe type of k is "+k.getClass().toString());
它的运行结果为
Vaule of k is; 9.
The type of k is class java.lang.Integer
现在说是为什么byte类型不能直接转换成int类型,
众所周知,他们两个的大小和取值范围是不同的:
int | byte |
---|---|
4字节 | 1字节 |
-2147483648~2147483647 | -128~127 |
所以把一个范围大的类型转换成范围小的类型必然是不够可靠的,因为这可能会丢失信息。
比如,可以运行这个代码:
int i = 666;
byte x = (byte) i;
System.out.println(x);
这段代码的运行结果是
-102
这个结果很好的证明了上面可能会丢失信息的观点。
至于为何会是这样的结果,不妨将int类型的666转换为二进制
0010 1001 1010
而byte是只有1字节8位的,所以上面的x只有
1001 1010
做高位是1,所以这是个负数,取反加1得
0110 0110
因此,x的值为
-102