由一道题引入:
public class BadArithmetic {
static byte addOneAndOne(){
byte a = 1;
byte b = 1;
byte c = a+b;
return c;
}
}
在低版本的eclipse中,结果是编译错误:BadArithmetic.java (7): Incompatible type for declaration.
Explicit cast needed to convert int to type.
byte c = a+ b;
类型转换原因:Java类型转换,需要进行基本类型转换工作的操作码(见附表)。这些执行转换工作的操作码后面没有操作数。转换的值从栈顶端获得。java虚拟机从栈顶端弹出一个值,对它进行转换,然后再把转换结果压入栈。
分析:
Java虚拟机没有把long,float,double类型值直接转换为比int类型占据更小空间的数据类型的操作码。因为,把float类型值转化为byte类型需要两个步骤。
首先,float类型值必须通过f2i指令转换为int类型值。
然后,所得的int类型再通过i2b指令转换为byte类型值。
尽管有操作码可以把int类型值转化为比int类型值占据更小空间的数据类型(byte,short和char),但并不存在执行相反方向转换的操作码。
因为任何byte,short和char类型在压入栈的时候,就已经有效地转化成int类型值。从数组或者堆中的对象中接受byte,short,和char类型值
的指令和把这些压入栈的指令都会把他们转换为int类型,然后对int类型值进行运算。
所以上诉代码出现的a+b是int类型,补救为:
public class GoodArithmetic {
static byte addOneAndOne() {
byte a = 1;
byte b = 1;
byte c = (byte)(a+b);
return c;
}
操作码 | 操作数 | 说明 |
---|---|---|
i2l | (无) | 将int类型转换为long类型值 |
i2f | (无) | 将int类型转换为float类型值 |
i2d | (无) | 将int类型转换为double类型值 |
l2i | (无) | 将long类型转换为int类型值 |
l2f | (无) | 将long类型转换为float类型值 |
l2d | (无) | 将long类型转换为double类型值 |
f2i | (无) | 将float类型转换为int类型值 |
f2l | (无) | 将float类型转换为longt类型值 |
f2d | (无) | 将float类型转换为double类型值 |
d2i | (无) | 将double类型转换为int类型值 |
d2l | (无) | 将double类型转换为long类型值 |
d2f | (无) | 将double类型转换为float类型值 |
|
|
|
操作码 | 操作数 | 说明 |
---|---|---|
i2b | (无) | 将int类型值转换为byte类型值 |
i2c | (无) | 将int类型值转换为char类型值 |
i2s | (无) | 将int类型值转换为short类型值 |
|
|