签名与无签名班次
在 Java 中,所有数字原语都是签名的。例如,int 总是表示来自[-2 ^ 31 - 1,2 ^ 31]的值,保持第一位对值进行符号 - 1 表示负值,0 表示正数。
基本移位运算符 >>
和 <<
是签名运算符。他们将保留价值的标志。
但程序员通常使用数字来存储无符号值。对于 int,它意味着将范围转换为[0,2 ^ 32 - 1],其值是 signed signed 的两倍。
对于那些高级用户来说,签名的位没有任何意义。这就是为什么 Java 添加了 >>>
,一个左移运算符,无视该符号位。
initial value: 4 ( 100)
signed left-shift: 4 << 1 8 ( 1000)
signed right-shift: 4 >> 1 2 ( 10)
unsigned right-shift: 4 >>> 1 2 ( 10)
initial value: -4 ( 11111111111111111111111111111100)
signed left-shift: -4 << 1 -8 ( 11111111111111111111111111111000)
signed right-shift: -4 >> 1 -2 ( 11111111111111111111111111111110)
unsigned right-shift: -4 >>> 1 2147483646 ( 1111111111111111111111111111110)
为什么没有 <<<
?
这来自右移的预期定义。因为它填满了左边的空旷地方,所以没有决定采取一点点的标志。因此,不需要 2 个不同的运算符。
请参阅此问题以获得更详细的答案。