qed*_*qed 3 java bit-manipulation
这是代码:
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));
Run Code Online (Sandbox Code Playgroud)
这是输出:
-56
-56
200
200
Run Code Online (Sandbox Code Playgroud)
与0xff的按位AND不应该改变任何东西b,但显然它确实有效果,为什么?
它有一个效果,因为200超出了最大可能的(签约)byte,127.-56由于此溢出,已分配该值.设置最重要的字节值-128.
11001000
Run Code Online (Sandbox Code Playgroud)
前两个输出语句因此显示-56,并且转换为a short将执行符号扩展以保留负值.
当你表演时& 0xff,会发生两件事.首先,int使用符号扩展将值提升为a .
11111111 11111111 11111111 11001000
Run Code Online (Sandbox Code Playgroud)
然后,执行bit-and,仅保留最后8位.这里,第8位不再-128,但是128,200恢复了.
00000000 00000000 00000000 11001000
Run Code Online (Sandbox Code Playgroud)
无论是否将值转换为a,都会发生这种情况short; a short有16位,可以很容易地表示200.
00000000 11001000
Run Code Online (Sandbox Code Playgroud)