官网:http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html

原文地址:http://www.linmuxi.com/2016/02/25/jvm-int-pushstack-01/

https://blog.csdn.net/zhaow823/article/details/81199093

本篇主要分享下在JVM中int类型数值采用何种指令入栈的,根据int值范围JVM入栈字节码指令就分为4类,下面分别介绍下这四类指令。

前言

当int取值-1~5采用iconst指令,取值-128~127采用bipush指令,取值-32768~32767采用sipush指令,取值-2147483648~2147483647采用 ldc 指令。

iconst

当int取值-1~5时,JVM采用iconst指令将常量压入栈中。
定义Test.java文件

1 public static void main(String[] args) {
2     int i = 5;
3     int j = -1;
4 }

查看class文件

1 public static void main(java.lang.String[]);
2 Code:
3 0: iconst_5
4 1: istore_1
5 2: iconst_m1
6 3: istore_2
7 4: return
8 }

分析class文件,int取值0~5时JVM采用iconst_0、iconst_1、iconst_2、iconst_3、iconst_4、iconst_5指令将常量压入栈中,取值-1时采用iconst_m1指令将常量压入栈中。

bipush

当int取值-128~127时,JVM采用bipush指令将常量压入栈中。
定义Test.java文件

1 public static void main(String[] args) {
2     int i = 127;
3 }

查看class文件

1 public static void main(java.lang.String[]);
2 Code:
3 0: bipush 127
4 2: istore_1
5 3: return
6 }

可以看到上面代码第三行是采用bipush指令将常量127压入栈中。

sipush

当int取值-32768~32767时,JVM采用sipush指令将常量压入栈中。
定义Test.java文件

1 public static void main(String[] args) {
2     int i = 32767;
3 }

查看class文件

1 public static void main(java.lang.String[]);
2 Code:
3 0: sipush 32767
4 3: istore_1
5 4: return
6 }

可以看到上面代码第三行是采用sipush指令将常量32767压入栈中。

ldc

当int取值-2147483648~2147483647时,JVM采用ldc指令将常量压入栈中。
定义Test.java文件

1 public static void main(String[] args) {
2     int i = Integer.MAX_VALUE;
3 }

查看class文件

1 public static void main(java.lang.String[]);
2 Code:
3 0: ldc #2; //int 2147483647
4 2: istore_1
5 3: return
6 }

可以看到上面代码第三行是采用ldc指令将2147483647常量压入栈中,需要注意的是ldc指令是从常量池中获取值的,也就是说在这段范围(-2147483648~2147483647)内的int值是存储在常量池中的。

JVM字节码之整型入栈指令(iconst、bipush、sipush、ldc)相关推荐

  1. JVM字节码之整型iconst、istore、iload指令

    局部变量表 局部变量表(Local Variable Table)是一组变量值存储空间,用于存放方法参数和方法内定义的局部变量. 一个局部变量可以保存一个类型为boolean.byte.char.sh ...

  2. java sipush_003-整型入栈指令(iconst、bipush、sipush、ldc)

    一.概述 二.前言 当int类型 取值-1~5采用iconst指令 取值-128~127采用bipush指令 取值-32768~32767采用sipush指令 取值-2147483648~214748 ...

  3. 【JVM · 字节码】指令集 解析说明

    1. 概述 Java字节码指令对于虚拟机,就好像汇编语言对于计算机,属于基本执行指令. Java虚拟机的指令由 一个字节长度 的.代表着某种特定操作含义的数字(称为 操作码/Opcode)以及跟随其后 ...

  4. JVM字节码指令集大全及其介绍

    Java是怎么跨平台的 我们上计算机课的时候老师讲过:"计算机只能识别0和1,所以我们写的程序要经过编译器翻译成0和1组成的二进制格式计算机才能执行".我们编译后产生的.class ...

  5. [三] java虚拟机 JVM字节码 指令集 bytecode 操作码 指令分类用法 助记符

    说明,本文的目的在于从宏观逻辑上介绍清楚绝大多数的字节码指令的含义以及分类 只要认真阅读本文必然能够对字节码指令集有所了解 如果需要了解清楚每一个指令的具体详尽用法,请参阅虚拟机规范 指令简介 计算机 ...

  6. 深入理解JVM字节码(二)

    目录 字节码基础 一.字节码概述 二.Java虚拟机栈和栈帧 栈帧 1. 局部变量表 2. 操作数栈 三.字节码指令 1. 加载和存储指令 2. 操作数栈指令 3. 对象相关的字节码指令 1. ``方 ...

  7. 【深入理解java虚拟机】 - JVM字节码指令介绍

    文章目录 什么是字节码指令 javap的用法 字节码与数据类型 字节码指令集 加载和存储指令 运算指令 类型转换指令 对象创建与访问指令 操作数栈管理指令 控制转移指令 方法调用和返回指令 异常处理指 ...

  8. Java指令全集_Java的JVM字节码指令集详解

    本文详细介绍了如何使用javap查看java方法中的字节码.以及各种字节码的含义,并且配以完善的案例,一步步,从头到尾带领大家翻译javap的输出.在文末还附有JVM字节码指令集表. 本文不适合没有J ...

  9. 深入理解JVM字节码(一)

    目录 深入剖析Class文件结构 一.初探class文件 二.class文件结构剖析 (一) 魔数 (二) 版本号 (三) 常量池 1. CONSTANT_Integer_info和CONSTANT_ ...

最新文章

  1. VS Code:史上最全的VS Code快捷键+分门别类(中英文对照版)
  2. 2021.12.20用ULN2003驱动四线步进电机
  3. C#中Trim()、TrimStart()、TrimEnd()的错误认识
  4. Docker容器技术-基础与架构
  5. DNA序列 LOJ NOIP模拟赛 D1T1 字符串哈希
  6. 算法导论 CLRS 23.3 解答 (未完成)
  7. android 手机内存uri_Android消息机制Handler原理解析
  8. 10.iterm 2 install rz , sz
  9. git 公钥提交代码_Git自由之章 - 关于SSH 公钥
  10. gliffy confluen插件gliffy-confluence-plugin-5.1.ja破解
  11. WLC5508 HA ( AP SSO)
  12. 《智能制造时代的研发智慧:知识工程2.0》一第3章 隐性知识的显性化
  13. windchill 系统客制角色
  14. 软考系统架构设计师论文真题汇总(2015-2017)
  15. 数千个数据库、遍布全国的物理机,京东物流全量上云实录 | 卓越技术团队访谈录...
  16. 数据资产管理的5个步骤和6个要素
  17. 软件测试中如何测试算法?
  18. JAVA程序设计基础期末复习资料
  19. 计算机专业课科目,考研计算机专业课有哪些科目
  20. idea package自动生成_Java idea使用generator自动生成mapper | Rickytsang洛水寒

热门文章

  1. 利用浏览器LocalStorage缓存图片,视频文件
  2. 手机端viewport的设置规范
  3. 淘宝旺铺基础版装修出专业版效果(不花钱也一样做到)
  4. android ImageButton的图片怎么定义?
  5. 简单01背包 POJ3211 Washing Clothes 多种衣服分别dp
  6. POS 客显 设备 显示 总价 单价 找零 收款 C# SerialPort 法
  7. IE不能為讀(written)問題解決(轉載)
  8. 交换排序之——快速排序(c/c++)
  9. BottomNavigationBar使用详解
  10. Elasticsearch 参考指南(重要的系统配置)