003-整型入栈指令(iconst、bipush、sipush、ldc)
一、概述
官网:http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html
参考地址:http://www.linmuxi.com/2016/02/25/jvm-int-pushstack-01/
本篇主要分享下在JVM中int类型数值采用何种指令入栈的,根据int值范围JVM入栈字节码指令就分为4类,下面分别介绍下这四类指令。
二、前言
当int类型
取值-1~5采用iconst指令
取值-128~127采用bipush指令
取值-32768~32767采用sipush指令
取值-2147483648~2147483647采用 ldc 指令。
2.1、iconst指令
当int取值-1~5时,JVM采用iconst指令将常量压入栈中。
public static void main(String[] args) {
int i = 5;
int j = -1;
}
查看class文件
public static void main(java.lang.String[]);
Code:
0: iconst_5
1: istore_1
2: iconst_m1
3: istore_2
4: return
分析class文件,int取值0~5时JVM采用iconst_0、iconst_1、iconst_2、iconst_3、iconst_4、iconst_5指令将常量压入栈中,取值-1时采用iconst_m1指令将常量压入栈中。
2.2、bipush
当int取值-128~127时,JVM采用bipush指令将常量压入栈中。
public static void main(String[] args) {
int i = 127;
}
查看class文件
public static void main(java.lang.String[]);
Code:
0: bipush 127
2: istore_1
3: return
2.3、sipush
当int取值-32768~32767时,JVM采用sipush指令将常量压入栈中。
public static void main(String[] args) {
int i = 32767;
}
查看class文件
public static void main(java.lang.String[]);
Code:
0: sipush 32767
3: istore_1
4: return
2.4、ldc
当int取值-2147483648~2147483647时,JVM采用ldc指令将常量压入栈中。
public static void main(String[] args) {
int i = Integer.MAX_VALUE;
}
查看class
public static void main(java.lang.String[]);
Code:
0: ldc #3 // int 2147483647
2: istore_1
3: return
采用ldc指令将2147483647常量压入栈中,需要注意的是ldc指令是从常量池中获取值的,也就是说在这段范围(-2147483648~2147483647)内的int值是存储在常量池中的。
003-整型入栈指令(iconst、bipush、sipush、ldc)的更多相关文章
- JVM字节码之整型入栈指令(iconst、bipush、sipush、ldc)
官网:http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html 原文地址:http://www.linmuxi.com/2016/02 ...
- JVM 字节码之 int 入栈指令
本文转载自JVM 字节码之 int 入栈指令(iconst.bipush.sipush.ldc) 前言 本文介绍 int 入栈指令 iconst.bipush.sipubh.Idc. 当 int 取值 ...
- ARM的栈指令
ARM的指令系统中关于栈指令的内容比较容易引起迷惑,这是因为准确描述一个栈的特点需要两个参数: 栈地址的增长方向:ARM将向高地址增长的栈称为递增栈(Descendent Stack),将向低地址增长 ...
- ARM的栈指令(转)
ARM的指令系统中关于栈指令的内容比较容易引起迷惑,这是因为准确描述一个栈的特点需要两个参数: 栈地址的增长方向:ARM将向高地址增长的栈称为递增栈(Descendent Stack),将向低地址增长 ...
- 为什么阿里巴巴Java开发手册中强制要求整型包装类对象值用 equals 方法比较?
在阅读<阿里巴巴Java开发手册>时,发现有一条关于整型包装类对象之间值比较的规约,具体内容如下: 这条建议非常值得大家关注, 而且该问题在 Java 面试中十分常见. 还需要思考以下几个 ...
- 关于整型Integer、Int32、Int64、IntPtr、UINT、UInt32、Cardinal、UInt64、UIntPtr、NativeUInt、Pointer、Handle
知识点1:UIntPtr = NativeUInt = Pointer = Handle 随程序的位数改变而改变.如下: 所以以后再用指针的时候要这样:UintPtr/NativeUInt(实例) = ...
- Linux漏洞分析入门笔记-CVE_2018_6323_整型溢出
操作系统 Ubuntu 16.04 /32 位 调试器 IDA pro 7.0 漏洞软件 binutils-2.29.1 0x00: 漏洞描述 1.什么是整数溢出: 在计算机中,整数分 ...
- MakeObjectInstance的前世今生(关键是ECX的何时入栈以及Self指针何时存储的)
高手们的文章有很大启发,但是总有些小错,也有没交代清楚的,以下是我的理解: 编译器编译MainWndProc的时候,它是一个正常Delphi普通函数,MakeObjectInstance对它做变换是运 ...
- javascript没有长整型
记录一下前几天踩坑的经历. 背景:一个项目某一版之后很多用easyui的表格控件treegrid渲染的表格都显示不出来了 奇怪的地方主要有以下几点: 项目在测试环境才会这样,在本机能够正常运行,多次重 ...
随机推荐
- javascript 中对象的拷贝
http://blog.csdn.net/i10630226/article/details/52431562 在javascript中,对象都是值引用,也就是说,如果你常规的使用 "=&q ...
- 利用python拼接图片
问题描述: 将16张图片拼接成4x4的图片, 且不改变每单张图片的像素值. 代码如下: import os from PIL import Image path = '/share1/home/con ...
- Atitit. 订单管理 收银单持久化 功能设计 基于ecshop订单结构
Atitit. 订单管理 收银单持久化 功能设计 基于ecshop订单结构 1. 54.order_info 订单 数据结构1 2. Ecshop 的订单api1 2.1. 生成订单 code b ...
- Spring 新手教程(二) 生命周期和作用域
以下的知识点是针对使用配置文件讲的(annotation相应标签后面文章会具体阐述) Bean的生命周期: 为什么关心这个问题? 我们使用IOC的目的就是为了让Spring IOC帮我们管理对象.从而 ...
- Android JNI和NDK学习(02)--静态方式实现JNI(转)
本文转自:http://www.cnblogs.com/skywang12345/archive/2013/05/23/3095013.html JNI包括两种实现方法:静态和动态.两种方法的区别如下 ...
- python统计订单走势
#coding=utf-8 import numpy as np import pandas as pd import matplotlib.pyplot as plt import matplotl ...
- css中div标签不置顶
设置div属性垂直对齐方式为:top <div style="vertical-align: top;"></div>
- Linux 部署jenkins + svn + mavne + tomcat8自动化部署
1,下载Jenkins war包 官网下载地址 https://jenkins.io/ 2.初始化安装 1)首次启动jenkins,出于安全考虑,jenkins会生成一个随机的口令到 /root ...
- java获取真实的ip地址
直接上代码,获取请求主机的IP地址,如果通过代理进来,则透过防火墙获取真实IP地址 public class IPUtil { private static final Logger logger = ...
- archive的时候报“ no identity found"错误 解决方式
第一步: 在xcode----target----general----identity----team里 增加你们公司的账号就能够了 第二步: Xcode > Preferences > ...