第11章 类型转换
java虚拟机包括许多进行基本类型转换工作的操作码,这些执行转换工作的操作码后面没有操作数,转换的值从栈顶端获得。java虚拟机从栈顶端弹出一个值,对它进行转换, 然后再把转换结果压入栈。
int、float、long和double相互转换操作码:
int类型转换为比int类型占据更小空间的数据类型:byte、char、short。
float转换为byte需要两个步骤:首先float必须通过f2i转换为int类型,然后再通过i2b指令转换为byte类型。
不存在把byte、char、short转换为int的指令,因为任何byte、char、short类型值压入栈的时候,就已经有效地被转换为int类型值。从数组或堆中的对象中接受byte、char、short类型值的指令和把这些值压入栈的指令都会把它们转换为int类型值。
涉及byte、char、short类型的运算操作首先会把它们转换为int类型,然后对int类型值进行运算,最后得到int类型的结果。如果需要得到相应更小类型的结果,必须将这个int结果显示转换为对应的类型。
class ArithmeticExample {
static byte addMethod() {
byte a = 1;
byte b = 1;
//编译错误:无法把int结果赋值给byte类型
b = a + b;
return b;
}
//正确的做法
static byte addMethodCorrect() {
byte a = 1;
byte b = 1;
b = (byte) (a + b);
//或者使用复合运算符: b += a;
return b;
}
}
java虚拟机通过截短和带符号扩展的方法将int、long类型转换为byte、short和int类型。