起因


16行:对int类型右移一位
19行:对short类型右移一位
输入后果,int类型是4194303,而short类型还是-1

问题钻研


扭转了下代码,棘手输入了二进制。能够发现short的-1二进制输入的有点问题,长度是32位而不是16位。

排查之后发现,是我调用的办法,只承受int类型的值,所以short会被强制转化成int类型,所以输入的二进制是32位。

简化代码,为了更不便的看short的解决逻辑

上半部分为编译之后的class文件,上面为java虚拟机运行的汇编码
Code:5 iushr: 用的是int类型的位移指令

位移指令:ishl、ishr、iushr、lshl、lshr、lushr

Code:6 i2s: 类型转化,int类型转成short类型

窄化类型转换指令:i2b、i2c、i2s、l2i、f2i、f2l、d2i、d2l和d2f

总结

由上可知,对short类型数据进行移位操作时,short会先变成int类型进行移位操作,操作结束之后又会转成short类型。

   short two = -1;   two >>>= 10;

对于-1,int类型为32位1,右移10位为:1111111111111111111111(22位),持续强转成short为1111111111111111(16位),对于short而言,还是-1。