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."<init>":()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

}

《深入Java虚拟机学习笔记》- 第11章 类型转换的更多相关文章

  1. java JDK8 学习笔记——第11章 线程和并行API

    第11章 线程与并行API 11.1 线程 11.1.1 线程 在java中,如果想在main()以外独立设计流程,可以撰写类操作java.lang.Runnable接口,流程的进入点是操作在run( ...

  2. 《深入Java虚拟机学习笔记》- 第19章 方法的调用与返回

    <深入Java虚拟机学习笔记>- 第19章 方法的调用与返回

  3. 《深入Java虚拟机学习笔记》- 第16章 控制流

    <深入Java虚拟机学习笔记>- 第16章 控制流

  4. 《深入Java虚拟机学习笔记》- 第17章 异常

    <深入Java虚拟机学习笔记>- 第17章 异常

  5. 《深入Java虚拟机学习笔记》- 第13章 逻辑运算

    <深入Java虚拟机学习笔记>- 第13章 浮点运算

  6. 《深入Java虚拟机学习笔记》- 第14章 浮点运算

    <深入Java虚拟机学习笔记>- 第13章 浮点运算

  7. 《深入Java虚拟机学习笔记》- 第8章 连接模型

    Java虚拟机学习笔记(八)连接模型

  8. 《深入Java虚拟机学习笔记》- 第4章 网络移动性

    Java虚拟机学习笔记(四)网络移动性

  9. 《深入Java虚拟机学习笔记》- 第2章 平台无关

    Java虚拟机学习笔记(二)平台无关

  10. java JDK8 学习笔记——第16章 整合数据库

    第十六章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API中的接口会有数据库厂商操作,称为JDBC驱动程 ...

随机推荐

  1. 使用pd设计表的 多对多的中间表的设计方式, 有图有真相

    设计多对多表时解决重复问题 目前流行两种设计方式: 方式一 是在中间表中建一个单独的id主键, 与业务表关联的键设置为unique唯一; 干事二: 联合主键的方式, 该方式中间表不会有与业务表无关的主 ...

  2. hdu 4717 The Moving Points(第一个三分题)

    http://acm.hdu.edu.cn/showproblem.php?pid=4717 [题意]: 给N个点,给出N个点的方向和移动速度,求每个时刻N个点中任意两点的最大值中的最小值,以及取最小 ...

  3. ParentChildTest.java

    public class ParentChildTest { public static void main(String[] args) { Parent parent=new Parent(); ...

  4. Extjs布局——layout: 'card'

    先看下此布局的特性: 下面演示一个使用layout: 'card'布局的示例(从API copy过来的)——导航面板(注:导航面板切换下一个或上一个面板实际是导航面板的布局--layout调用指定的方 ...

  5. aJax提交——服务端不能用request存储数据,session存数据客户端可以接收到

    aJax提交与普通提交是两种迥异的提交方式,这两种提交方式决定了客户端与服务端交互时存储.传输数据的方式也不同. aJax提交,客户端的请求数据存储在data中,服务端用request.getPara ...

  6. 团体程序设计天梯赛-练习集L2-001. 紧急救援(dijkstra)

    L2-001. 紧急救援 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国 ...

  7. Ehcache 整合Spring 使用页面、对象缓存(转载)

    Ehcache在很多项目中都出现过,用法也比较简单.一般的加些配置就可以了,而且Ehcache可以对页面.对象.数据进行缓存,同时支持集群/分布式缓存.如果整合Spring.Hibernate也非常的 ...

  8. web机制简笔

    1 Web 1.1输入url地址 1.1.1服务器进行url解析,调用相关服务处理,返回处理结果—字符串 1.2得到返回字符串(显示描述+操作触发描述) 1.3Internet explore进行相关 ...

  9. DIY Ruby CPU 分析 Part II

    [编者按]作者 Emil Soman,Rubyist,除此之外竟然同时也是艺术家,吉他手,Garden City RubyConf 组织者.本文是 DIY Ruby CPU Profiling 的第二 ...

  10. Servlet课程0425(六) 不经过验证直接跳转---session实现不同页面之间共享数据

    在地址栏直接输入http://localhost:8080/myWebSite/wel 会发现页面也能跳转,只不过用户名和密码都为空,这是不可以的,因为没有经过验证非法登录了 Welcome,hell ...