乐趣区

关于java:short类型移位问题研究

起因


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。

退出移动版