带符号字节的按位AND运算

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,但显然它确实有效果,为什么?

rge*_*man 8

它有一个效果,因为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)