我对负数的右移操作非常困惑,这是代码。

int n = -15;
System.out.println(Integer.toBinaryString(n));
int mask = n >> 31;
System.out.println(Integer.toBinaryString(mask));

结果是:
11111111111111111111111111110001
11111111111111111111111111111111

为什么将负数右移31而不是1(符号位)?

最佳答案

因为在Java中没有无符号数据类型,所以有两种右移类型:arithmetic shift >>logical shift >>>http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html

算术移位>>将保留符号位。


无符号移位>>>将不保留符号位(从而填充0)。

(图片来自维基百科)

顺便说一下,算术左移和逻辑左移都具有相同的结果,因此只有一个左移<<

关于java - Java:负数右移,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15457893/

10-11 02:26