java虚拟机包括许多进行基本类型转换工作的操作码,这些执行转换工作的操作码后面没有操作数,转换的值从栈顶断获得。java虚拟机从栈顶端弹出一个值,对它进行转换,然后再把转换结果压入栈。
int、long、float、double
类型之间的相互转换
操作码
操作数
说明
i2l
(无)
将int类型的值转换为long类类型
i2f
(无)
将int类型的值转换为float类类型
i2d
(无)
将int类型的值转换为double类类型
l2i
(无)
将long类型的值转换为int类类型
l2f
(无)
将long类型的值转换为float类类型
l2d
(无)
将long类型的值转换为double类类型
f2i
(无)
将float类型的值转换为int类类型
f2l
(无)
将float类型的值转换为long类类型
f2d
(无)
将float类型的值转换为double类类型
d2i
(无)
将double类型的值转换为int类类型
d2l
(无)
将double类型的值转换为long类类型
d2f
(无)
将double类型的值转换为float类类型
int数据类型向byte、char、short类型的转换
操作码
操作数
说明
i2b
(无)
将int类型值转换为byte类型值
i2c
(无)
将int类型值转换为char类型值
i2s
(无)
将int类型值转换为short类型值
i2b指令将弹出的int类型值截取为byte类型,然后再对其进行带符号扩展,恢复成int类型压入栈。
i2c指令将弹出的int类型值截取为char类型,然后再对其进行零扩展,恢复成int类型压入栈
i2s将弹出的int类型值截取为short类型,然后再对其进行带符号扩展,恢复成int类型压入栈
不存在把比int类型值占据更小空间的数据类型转换成int类型的操作码。因为任何byte、char、short类型值在压入栈的时候,就已经有效的转换成int类型了,涉及到byte、char、short类型的运算操作首先都把这些值转化成int类型,然后对int类型值进行运算,最后得到int类型的结果。
例如如下代码:
public
class
converttest {
/**
* @param
args
*/
public
static
void
main(string[] args) {
//
todo
auto-generated method stub
byte
a = 1;
byte
b = 1;
byte
c =
(byte)(a
+ b);
}
}
用javap工具查看其字节码指令:
compiled
from "converttest.java"
public
class converttest extends java.lang.object{
public
converttest();
code:
0: aload_0
1: invokespecial #8;
//method java/lang/object."":()v
4: return
public
static void main(java.lang.string[]);
code:
0: iconst_1
//常量1入栈
1: istore_1
//弹出栈顶元素存入位置为1的局部变量
2: iconst_1
//常量1入栈
3: istore_2
//弹出栈顶元素存入位置为2的局部变量
4: iload_1
//取出位置1的局部变量的值入栈
5: iload_2
//取出位置2的局部变量的值入栈
6: iadd
//弹出栈顶两个元素做加法,然后结果入栈
7: i2b
//转化成byte类型
8: istore_3
//弹出栈顶元素存入位置为3的局部变量
9: return
}
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/