short、byte 运算不能赋值给原类型问题分析

一、题目分析

该题目来源于牛客网中的一道选择题

给出如上代码,问你输入结果,但是考试时并不能看出错误原因导致踩坑 ;

鼠标指向报错位置,直接给出提示了,两种类型四则运算都会强制转换为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 了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值