2018-07-03 Java类结构与编译指令--类型自动转换

使用Java的都知道,在基本数据类型int/byte/short/char之间,byte/char/short与int类型运算及赋值时会自动提升类型,而反过来则会编译报错

通过JVM操作指令来解释这种现象

JVM虚拟机指令集所支持的数据类型

image

image

通过上图可以看到对于byte/short/char来说load/store以及各种运算操作,逻辑操作,

上代码

public byte testFun(){
        long l = 30l;
        int x = (int)l;
        
        byte b =100;
        b = (byte)x;
        
        return b;
    }

javap -v

 public byte testFun();
    descriptor: ()B
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=2, locals=5, args_size=1
         0: ldc2_w        #2                  // long 30l
         3: lstore_1
         4: lload_1
         5: l2i                                 // x = (int)l
         6: istore_3
         7: bipush        100                // push一个byte常量到操作数栈
         9: istore        4                  // 将操作数栈存储到局部变量表slot_4
        11: iload_3                          // 从局部变量表slot_3加载到操作数栈
        12: i2b                              // b = (byte)x
        13: istore        4                  // 将操作数栈顶值保存以slot_4
        15: iload         4                  // 将slot_4加载到操作数栈的return value
        17: ireturn
      LineNumberTable:
        line 7: 0
        line 8: 4
        line 10: 7
        line 11: 11
        line 13: 15

仔细查看整个操作过程,与上面的表对应可看到;在运算的过程中,将byte类型加载到操作数栈时,使用的指令是iload_,并且在return时,也同样的ireturn

你可能感兴趣的:(2018-07-03 Java类结构与编译指令--类型自动转换)