这是代码:
int i = 200;
byte b = (byte) 200;
System.out.println(b);
System.out.println((short) (b));
System.out.println((b & 0xff));
System.out.println((short) (b & 0xff));
这是输出:
-56
-56
200
200
按位AND与0xff不应该改变b中的任何内容,但显然它确实有效,为什么?
解决方法:
它有效,因为200超出了最大可能(带符号)字节127.由于此溢出,该值已经分配了-56.设置了最重要的字节,值为-128.
11001000
因此,前两个输出语句显示-56,并且转换为short将执行符号扩展以保留负值.
当你表演& 0xff,发生了两件事.首先,将值提升为带符号扩展名的int.
11111111 11111111 11111111 11001000
然后,执行bit-and,仅保留最后8位.这里,第8位不再是-128,而是128,因此恢复了200.
00000000 00000000 00000000 11001000
无论价值是否变为短期,都会发生这种情况;短路有16位,可以很容易地代表200位.
00000000 11001000
标签:java,bit-manipulation
来源: https://codeday.me/bug/20190722/1504866.html