我最近在 Java 中使用了移位运算符,并注意到该>>
运算符与 C 中的含义不同>>
。在 Java>>
中是有符号移位,它使第一位保持相同的值。在 Java 中,相当于 C 的 shift 是>>>
运算符。左移运算符 ( <<
) 与 C 中的相同,只是移动忽略第一位。
我想知道的是
- 为什么要做这个改变?
- 为什么符号不一致,所以 >> 和 << 是有符号移位而 >>> 和 <<< 是无符号的?
- 有符号的班次运算符有什么用吗?
我最近在 Java 中使用了移位运算符,并注意到该>>
运算符与 C 中的含义不同>>
。在 Java>>
中是有符号移位,它使第一位保持相同的值。在 Java 中,相当于 C 的 shift 是>>>
运算符。左移运算符 ( <<
) 与 C 中的相同,只是移动忽略第一位。
我想知道的是
从来不需要符号感知左移,因为 2:s 补码表示将符号存储在最高有效位中。
以某种“符号感知”方式将值向左移动一位没有区别,您没有什么可以做的不同。将位向左移动,在最低有效位中插入一个 0,就完成了。
对于带符号的数字,右移不是那么明确,这就是为什么有两个运算符。
据我所知,在 Java 中>>
和>>>
一直是一样的。
为什么要做这个改变?
机器独立性。的含义在>>
某种程度上取决于 C 中的实现。
有符号左移和无符号左移完全等价,因此不需要单独的运算符。
另一方面,Java 没有无符号类型,因此它不能依赖类型来确定要使用的转换。
作为参考,我认为您倒退了->>
有符号右移,>>>
无符号右移。