我们来看一下这段代码
char a = 121;
char b = 122;
System.out.println(a);
System.out.println(b);
System.out.println(a + b);
这段代码的运行结果:
前两行输出就是变量赋值对应的字符,但是最后一个加法输出为什么直接输出了两个数字的和呢?
为什么这里直接转成整数类型来计算了呢?
我们在很多地方都听过char类型的运算会转成int来运算,那么原因到底是什么?
我们来看一下《深入理解java虚拟机》中 字节码指令简介的介绍
byte、short和char都没有相应的指令。
我们看一下书中介绍:
大部分指令都没有支持整数类型byte、char和short,甚至没有任何指令 支持boolean类型。编译器会在编译期或运行期将byte和short类型的数据带符号扩展(Sign-Extend)为 相应的int类型数据,将boolean和char类型数据零位扩展(Zero-Extend)为相应的int类型数据。与之类 似,在处理boolean、byte、short和char类型的数组时,也会转换为使用对应的int类型的字节码指令来 处理。因此,大多数对于boolean、byte、short和char类型数据的操作,实际上都是使用相应的对int类 型作为运算类型(Computational Type)来进行的
我们看一下反编译class文件的结果:
确实执行的是iload和iadd,敲好印证了书中的东西
这就是问题所在,为什么char的运算转成了int 的运算,从根上找到了原因。
这是设计之初就规定好了