一、概述

官网: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)的更多相关文章

  1. JVM字节码之整型入栈指令(iconst、bipush、sipush、ldc)

    官网:http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html 原文地址:http://www.linmuxi.com/2016/02 ...

  2. JVM 字节码之 int 入栈指令

    本文转载自JVM 字节码之 int 入栈指令(iconst.bipush.sipush.ldc) 前言 本文介绍 int 入栈指令 iconst.bipush.sipubh.Idc. 当 int 取值 ...

  3. ARM的栈指令

    ARM的指令系统中关于栈指令的内容比较容易引起迷惑,这是因为准确描述一个栈的特点需要两个参数: 栈地址的增长方向:ARM将向高地址增长的栈称为递增栈(Descendent Stack),将向低地址增长 ...

  4. ARM的栈指令(转)

    ARM的指令系统中关于栈指令的内容比较容易引起迷惑,这是因为准确描述一个栈的特点需要两个参数: 栈地址的增长方向:ARM将向高地址增长的栈称为递增栈(Descendent Stack),将向低地址增长 ...

  5. 为什么阿里巴巴Java开发手册中强制要求整型包装类对象值用 equals 方法比较?

    在阅读<阿里巴巴Java开发手册>时,发现有一条关于整型包装类对象之间值比较的规约,具体内容如下: 这条建议非常值得大家关注, 而且该问题在 Java 面试中十分常见. 还需要思考以下几个 ...

  6. 关于整型Integer、Int32、Int64、IntPtr、UINT、UInt32、Cardinal、UInt64、UIntPtr、NativeUInt、Pointer、Handle

    知识点1:UIntPtr = NativeUInt = Pointer = Handle 随程序的位数改变而改变.如下: 所以以后再用指针的时候要这样:UintPtr/NativeUInt(实例) = ...

  7. Linux漏洞分析入门笔记-CVE_2018_6323_整型溢出

    操作系统   Ubuntu 16.04 /32 位 调试器     IDA pro 7.0 漏洞软件   binutils-2.29.1 0x00: 漏洞描述 1.什么是整数溢出: 在计算机中,整数分 ...

  8. MakeObjectInstance的前世今生(关键是ECX的何时入栈以及Self指针何时存储的)

    高手们的文章有很大启发,但是总有些小错,也有没交代清楚的,以下是我的理解: 编译器编译MainWndProc的时候,它是一个正常Delphi普通函数,MakeObjectInstance对它做变换是运 ...

  9. javascript没有长整型

    记录一下前几天踩坑的经历. 背景:一个项目某一版之后很多用easyui的表格控件treegrid渲染的表格都显示不出来了 奇怪的地方主要有以下几点: 项目在测试环境才会这样,在本机能够正常运行,多次重 ...

随机推荐

  1. 记一起和前端没什么卵关系的OPTION 405问题

    记一起和前端没什么卵关系的后端405问题 问题的关键点在于本来是POST请求,会变成OPTION请求,并且提示405报错,会类似跨域.并且只有某些手机机型才会(如Oppo系列). 其实跨域的问题,如果 ...

  2. Codeforces Round #240 (Div. 1)B---Mashmokh and ACM(水dp)

    Mashmokh's boss, Bimokh, didn't like Mashmokh. So he fired him. Mashmokh decided to go to university ...

  3. Atitit. 木马病毒的外部class自动加载机制------加载class的方法总结

    Atitit. 木马病毒的外部class自动加载机制------加载class的方法总结 Atitit.java load class methods 1. 动态加载jar文件和class文件. 1 ...

  4. gulp安装使用

    1. 安装nodeJs   2. 全局安装gulp: npm install gulp -g   3. 在cmd切换至项目文件夹下 npm init,创建package.json文件(JSON文件内不 ...

  5. java - day10 - uptest

    package day03; public class UpTest { public static void main(){ Aoo o = new Aoo(); o.a = 3; o.b = 3; ...

  6. address-already in use 以及查看端口

    https://stackoverflow.com/questions/19071512/socket-error-errno-48-address-already-in-use

  7. 【转】【Mac系统】之ADB命令总结

    参考文章: 张明云:<Android ADB命令大全(通过ADB命令查看wifi密码.MAC地址.设备信息.操作文件.查看文件.日志信息.卸载.启动和安装APK等)> Yjnull:< ...

  8. OpenCV学习笔记一:OpenCV概览与配置编译

    一,OpenCV OpenCV官方网站:http://opencv.org/  OpenCV目前最新代码库地址:https://github.com/itseez/opencv 二,简介: OpenC ...

  9. 一套一般般的前端框架 layui

    http://www.layui.com/doc/

  10. Charles常用设置

    一.软件说明 Charles 通过将自己设置成系统的网络访问代理服务器,使得所有的网络访问请求都通过它来完成,从而实现了网络封包的截取和分析. 二.mock数据 场景说明: 使用步骤: 1.保存待测试 ...