2

我最近在 Java 中使用了移位运算符,并注意到该>>运算符与 C 中的含义不同>>。在 Java>>中是有符号移位,它使第一位保持相同的值。在 Java 中,相当于 C 的 shift 是>>>运算符。左移运算符 ( <<) 与 C 中的相同,只是移动忽略第一位。

我想知道的是

  • 为什么要做这个改变?
  • 为什么符号不一致,所以 >> 和 << 是有符号移位而 >>> 和 <<< 是无符号的?
  • 有符号的班次运算符有什么用吗?
4

3 回答 3

2

从来不需要符号感知左移,因为 2:s 补码表示将符号存储在最高有效位中。

以某种“符号感知”方式将值向左移动一位没有区别,您没有什么可以做的不同。将位向左移动,在最低有效位中插入一个 0,就完成了。

对于带符号的数字,右移不是那么明确,这就是为什么有两个运算符。

于 2012-03-15T15:32:52.977 回答
2

据我所知,在 Java 中>>>>>一直是一样的。

为什么要做这个改变?

机器独立性。的含义在>>某种程度上取决于 C 中的实现。

于 2012-03-15T15:34:25.113 回答
1

有符号左移和无符号左移完全等价,因此不需要单独的运算符。

另一方面,Java 没有无符号类型,因此它不能依赖类型来确定要使用的转换。

作为参考,我认为您倒退了->>有符号右移,>>>无符号右移。

于 2012-03-15T15:32:40.447 回答