签名与无签名班次

在 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 个不同的运算符。

请参阅此问题以获得更详细的答案。