zoukankan      html  css  js  c++  java
  • 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值是存储在常量池中的。

  • 相关阅读:
    ES分页
    在github上使用workflow构建docker镜像并推送阿里云
    xxl-job滥用netty导致的问题和解决方案
    使用netty实现socks5协议
    docker日志设置
    关于我
    友情链接
    分布式任务调度系统:xxl-job
    SpringBoot自定义配置以及IDEA配置提示
    frp穿透内网使用vsftpd服务
  • 原文地址:https://www.cnblogs.com/bjlhx/p/8856179.html
Copyright © 2011-2022 走看看