>> 和 >>> 在 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.
我有一个这样的示例代码片段:
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.