我知道在Java中自动完成类型转换,以获得更高精度的低精度基本类型。例如,在此代码中:
int i = 20;
int j = 40;
float k = i + j; //explicit casting not required
我的问题是,内部实际发生了什么?在第三个声明中,i
和j
的值是否会单独转换为float
然后再加在一起?
或者首先在int
类型中添加,然后将添加结果投放到float
?
答案 0 :(得分:4)
它们被添加为int(就像你在没有赋值时执行i+j
那样),然后由于赋值而被转换为float。
但是,如果您执行了float k = (float) i + j
,那么j
会被转换为浮点数,因为加法的左侧是浮点数... float k = 1.0f*i + j
有道理吗?
答案 1 :(得分:4)
我们来看看吧!
$ cat > temp.java
class temp {
public void f() {
int i = 20;
int j = 40;
float k = i + j; //explicit casting not required
}
}
$ javac temp.java
$ javap -c temp
Compiled from "temp.java"
class temp {
temp();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public void f();
Code:
0: bipush 20
2: istore_1
3: bipush 40
5: istore_2
6: iload_1
7: iload_2
8: iadd
9: i2f
10: fstore_3
11: return
}
如您所见,首先将它们添加为整数(指令8),然后将其转换为浮点数(指令9)。
答案 2 :(得分:3)
隐式转换不应用于表达式的某些部分,而是应用于整个计算的结果。
您可以通过一个简单的示例来证明这一点:
int a = 1;
int b = 2;
float c = a / b;
以上为c
而不是0.5f
分配0,如果将float
投射到a
和/或{{1},则会产生结果}。