使用Java的都知道,在基本数据类型int/byte/short/char之间,byte/char/short与int类型运算及赋值时会自动提升类型,而反过来则会编译报错
通过JVM操作指令来解释这种现象
JVM虚拟机指令集所支持的数据类型
通过上图可以看到对于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_<n>,并且在return时,也同样的ireturn