基本类型的++操作原理

对于所有基本类型的++操作源代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static int test(){
byte a = 1;
a++;
char b = 1;
b++;
short c = 1;
c++;
int d = 1;
d++;
long e = 1;
e++;
float f = 1;
f++;
double g = 1;
g++;
return 0;
}

对应的字节码为:

byte/a++ char/b++ short/c++ int/d++
0: iconst_1
1: istore_0
2: iload_0
3: iconst_1
4: iadd
5: i2b
6: istore_0
7: iconst_1
8: istore_1
9: iload_1
10: iconst_1
11: iadd
12: i2c
13: istore_1
14: iconst_1
15: istore_2
16: iload_2
17: iconst_1
18: iadd
19: i2s
20: istore_2
21: iconst_1
22: istore_3
23: iinc 3, 1
long/e++ float/f++ double/g++
26: lconst_1
27: lstore 4
29: lload 4
31: lconst_1
32: ladd
33: lstore 4
35: fconst_1
36: fstore 6
38: fload 6
40: fconst_1
41: fadd
42: fstore 6
44: dconst_1
45: dstore 7
47: dload 7
49: dconst_1
50: dadd
51: dstore 7

可以看到

数据类型 虚拟机操作
byte,char,short iadd 指令,int操作,利用i2b,i2c,i2s强转类型
int iinc指令,int独有
long,float,double 对应ladd,fadd,dadd 指令,每种数据类型独有

所以,当byte,char,short进行加减运算时,本质上还是int运算,故需要强制类型转换。