>> 和 >>> 在 java 中具有负字节值的运算符

>> and >>> operator with negative byte value in java

我有一个这样的示例代码片段:

    byte a = -0b00001111;
    byte b = a;
    byte c = a;

    System.out.println("a=" + a );
    System.out.println("b=" + (b >> 1) );
    System.out.println("c=" + (c >>> 1) );

并且,它打印:

a=-15

b=-8

c=2147483640

我不是很明白 b 和 c 是如何分别变成这 2 个值的,请问有人能一步一步地向我展示这 2 个值是如何计算出来的吗?

对于字节 a,您有文字 0b00001111,它是 15 的二进制,所以 a-15-15 对于 byte 的位表示是:

11110001

在 Java、unary numeric promotion occurs 中移位运算符 <<>>>>> 的操作数。

Unary numeric promotion (§5.6.1) is performed on each operand separately.

这意味着该值在移位之前提升为 int

代码 (b >> 1)b 提升为 int,然后用符号扩展移动值。这意味着如果该值已经是负数,则移动 1 位以确保它仍然是负数。

11110001

晋升为

11111111 11111111 11111111 11110001

这是 -15 作为 int。右移一位后,带符号扩展:

11111111 11111111 11111111 11111000

也就是 -8.

但是,对于代码 (c >>> 1)>>> 无符号右移运算符 不会 执行符号扩展,即使提升到 int 确实保持符号和值。

11110001

晋升为

11111111 11111111 11111111 11110001

和以前一样 -15 作为 int。无符号右移一位后:

01111111 11111111 11111111 11111000

第一位现在是 0。没有设置最高有效位,该值现在是 231 - 8,或 2147483640.