《深入Java虚拟机学习笔记》- 第11章 类型转换
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章 类型转换的更多相关文章
- java JDK8 学习笔记——第11章 线程和并行API
第11章 线程与并行API 11.1 线程 11.1.1 线程 在java中,如果想在main()以外独立设计流程,可以撰写类操作java.lang.Runnable接口,流程的进入点是操作在run( ...
- 《深入Java虚拟机学习笔记》- 第19章 方法的调用与返回
<深入Java虚拟机学习笔记>- 第19章 方法的调用与返回
- 《深入Java虚拟机学习笔记》- 第16章 控制流
<深入Java虚拟机学习笔记>- 第16章 控制流
- 《深入Java虚拟机学习笔记》- 第17章 异常
<深入Java虚拟机学习笔记>- 第17章 异常
- 《深入Java虚拟机学习笔记》- 第13章 逻辑运算
<深入Java虚拟机学习笔记>- 第13章 浮点运算
- 《深入Java虚拟机学习笔记》- 第14章 浮点运算
<深入Java虚拟机学习笔记>- 第13章 浮点运算
- 《深入Java虚拟机学习笔记》- 第8章 连接模型
Java虚拟机学习笔记(八)连接模型
- 《深入Java虚拟机学习笔记》- 第4章 网络移动性
Java虚拟机学习笔记(四)网络移动性
- 《深入Java虚拟机学习笔记》- 第2章 平台无关
Java虚拟机学习笔记(二)平台无关
- java JDK8 学习笔记——第16章 整合数据库
第十六章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API中的接口会有数据库厂商操作,称为JDBC驱动程 ...
随机推荐
- Insist
1.怎么自动截断文本? 如题,当数据库中的数据内容超出了要显示的长度时,如果不采取措施,会破坏页面的布局美观,所以可以采用自动截断文本,需要查看的时候再把其他的内容显示出来. 没截断的时候如下图: 再 ...
- Java字符串之性能优化
基础类型转化成String 在程序中你可能时常会需要将别的类型转化成String,有时候可能是一些基础类型的值.在拼接字符串的时候,如果你有两个或者多个基础类型的值需要放到前面,你需要显式的将第一个值 ...
- Create CSS3 Buttons Compatible with All Browsers
Create CSS3 Buttons Compatible with All Browsers http://www.ourtuts.com/create-css3-buttons-compatib ...
- python学习笔记10(函数一): 函数使用、调用、返回值
一.函数的定义 在某些编程语言当中,函数声明和函数定义是区分开的(在这些编程语言当中函数声明和函数定义可以出现在不同的文件中,比如C语言),但是在Python中,函数声明和函数定义是视为一体的.在Py ...
- Android Studio 单刷《第一行代码》系列目录
前言(Prologue) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Android ...
- 阅读Google的C++代码规范有感
李开复曾在微博上说过,Google的C++代码规范是全球最好的一份C++代码规范,没有之一.最近花了点时间看了下这份代码规范,收获确实很大,在编程过程中一些乱七八糟的坏习惯也该改一改了.最新的英文版见 ...
- hadoop Safe mode is ON 的解决办法
hadoop Safe mode is ON 的解决办法 搭了一个hadoop集群环境,近期总是出现读写文件错误的情况,查看name node的日志显示 (Safe mode is ON) Safe ...
- Spring 注解 @Resource和@Autowired(转)
鸣谢:http://my.oschina.net/u/216467/blog/205951 @Resource和@Autowired两者都是做bean的注入使用. 其实@Resource并不是Spri ...
- java对象数组
问题描述: java 对象数组的使用 问题解决: 数组元素可以是任何类型(只要所有元素具有相同的类型) 数组元素可以是基本数据类型 数组元素也可以是类对象,称这样的数组为对象数组.在这种情况下 ...
- 【链表】bzoj 1150: [CTSC2007]数据备份Backup
1150: [CTSC2007]数据备份Backup Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1136 Solved: 458[Submit] ...