起因
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。