起因
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。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。