博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Jvm(42),指令集----字节码与数据类型
阅读量:6429 次
发布时间:2019-06-23

本文共 1230 字,大约阅读时间需要 4 分钟。

 

假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情请点击

 

在Java虚拟机的指令集中,大多数的指令都包含了其操作所对应的数据类型信息如,iload 指令用于从局部变量表中加载int型的数据到操作数栈中,而fload指令加载的则是float类型的数据。这两条指令的操作在虚拟机内部可能会是由同一段代码来实现的,但在Class文件中它们必须拥有各自独立的操作码。对于大部分与数据类型相关的字节码指令,它们的操作码助记符中都有特殊的字符来表明专门为哪种数据类型服务:i代表对int类型的数据操作,l 代表long,s代表short,b代表byte,c代表char,f代表float,d代表double,a代reference。也有一些指令的助记符中没有明确地指明操作类型的字母,如arraylength指令,它没有代表数据类型的特殊字符,但操作数永远只能是一个数组类型的对象。

由于Java虚拟机的操作码长度只有一个字节,所以包含了数据类型的操作码就为指令集的设计带来了很大的压力:如果每一种与数据类型相关的指令都支持Java虚拟机所有运行时数据类型的话,那指令的数量恐怕就会超出一个字节所能表示的数量范围了。因此,Java虚

拟机的指令集对于特定的操作只提供了有限的类型相关指令去支持它,换句话说,指令集将会故意被设计成非完全独立的(Java虚拟机规范中把这种特性称为"Not Orthogonal",即并非每种数据类型和每一种操作都有对应的指令)。有一些单独的指令可以在必要的时候用来将一些不支持的类型转换为可被支持的类型。

表6-31列举了Java虚拟机所支持的与数据类型相关的字节码指令,通过使用数据类型列所代表的特殊字符替换opcode列的指令模板中的T,就可以得到一个具体的字节码指令。如

果在表中指令模板与数据类型两列共同确定的格为空,则说明虚拟机不支持对这种数据类型执行这项操作。例如,load指令有操作int类型的iload,但是没有操作byte类型的同类指令。

注意,从表6-31中可以看出,大部分的指令都没有支持整数类型byte、char和short,甚至没有任何指令支持boolean类型。编译器会在编译期或运行期将byte和short类型的数据带符号扩展(Sign-Extend)为相应的int类型数据,将boolean和char类型数据零位扩展

(Zero-Extend)为相应的int类型数据。与之类似,在处理boolean、byte、short和char 类型的数组时,也会转换为使用对应的int类型的字节码指令来处理。因此,大多数对于

boolean、byte、short和char类型数据的操作,实际上都是使用相应的int类型作为运算类型(Computational

Type)。

 

转载地址:http://ghnga.baihongyu.com/

你可能感兴趣的文章
1.2魔术方法和延迟静态绑定
查看>>
windows下程序调用jar cvf 时通过动态传参导致生成的文件跑到其他盘符
查看>>
AdminLTE 学习笔记
查看>>
面试时,当你有权提问时,别客气,这是个逆转的好机会(内容摘自Java Web轻量级开发面试教程)...
查看>>
学习本身不难,难得是了解该学哪些——总结下我在架构师升级过程中的那些坑以及各种体会...
查看>>
poj 3216 Repairing Company
查看>>
npm install 错误 安装 chromedriver 失败的解决办法
查看>>
设计模式学习笔记之生成器模式
查看>>
jsp入门
查看>>
ORM之轻量级框架--Dapper
查看>>
asp.net mvc 强类型视图中传入List 数据到控制器
查看>>
自动化邮件报告平台-邮件发送highchart图表
查看>>
进程池的返回值
查看>>
053(二十一)
查看>>
ADO.NET笔记——执行事务
查看>>
QueryString 传值
查看>>
小谈一下反射
查看>>
C#调用SQlite常见问题汇总
查看>>
动态规划的简洁说明
查看>>
电脑技术论坛
查看>>