一、题目分析
该题目来源于牛客网中的一道选择题
给出如上代码,问你输入结果,但是考试时并不能看出错误原因导致踩坑 ;
鼠标指向报错位置,直接给出提示了,两种类型四则运算都会强制转换为int之后进行运算
二、具体原因
为什么两个 short 相加会变成 int,有的解释说,两个 short 相加可能溢出,所以用 int 来接就不会溢出,那这样的话,两个 int 相加岂不应该是 long 类型吗?其实本质的原因要从字节码开始讲起。
为什么 short、byte 会被提升为 int?
Java 虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表次操作所需参数(称为操作数,Operands)而构成。
Java 虚拟机的指令集中的大多数都对它们执行的操作的数据类型进行编码,例如 iload
指令,是将一个局部变量加载到操作栈,且这个局部变量必须是 int 类型,每一个指令都是只能接受对应类型的数据的。
但由于操作码的长度为一个字节,这意味着指令集的操作码总数不可能超过 256 条,这也为设计包含数据类型的操作码带来了很大压力:如果每一种与数据类型相关的指令都支持 Java 虚拟机所有运行时数据类型的话,那指令的数量就会超出一个字节所能表示的数量范围了。
根据下表(来源 Table 2.11.1-A. Type support in the Java Virtual Machine instruction set),可以发现大部分指令都没有支持 byte、char 和 short 类型,甚至没有任何指令支持 boolean 类型。因此如果要对两个 short 类型的数字相加,那只能转成 int,再使用 iadd 命令相加,然后再转成 short 了。