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值是存储在常量池中的。

  • 相关阅读:
    NYOJ 91 阶乘之和
    NYOJ 47 过河问题
    NYOJ 12 喷水装置(二)
    NYOJ 78 圈水池(凸包问题)
    NYOJ 523 亡命逃窜( bfs )
    NYOJ 564 最优对称路径(湖南省第七届大学生计算机程序设计竞赛)
    NYOJ 491 幸运三角形(bitset)
    排列组合 C(n,k)= C(n1)+C(n1,k1) 对应于杨辉三角
    Android (服务Service)
    Android (界面编程#5ProgressDialog)
  • 原文地址:https://www.cnblogs.com/bjlhx/p/8856179.html
Copyright © 2011-2022 走看看