[英]Difference between >> and >>> in Scala
Scala中的>>和>>>运算符有什么区别吗?
scala> 0x7f >>> 1
res10: Int = 63
scala> 0x7f >> 1
res11: Int = 63
scala> 0x7f >> 4
res12: Int = 7
scala> 0x7f >>> 4
res13: Int = 7
>>
运算符保留符号(符号扩展),而>>>
将最左边的位(零扩展)归零。
-10>>2
res0: Int = -3
-10>>>2
res1: Int = 1073741821
对于像C这样具有有符号和无符号类型的语言,这不是必需的,与Java不同,后者也有>>>
(因为它没有无符号整数)。
它们与Java中的含义相同。
带符号的左移运算符“<<”将位模式向左移位,带符号的右移运算符“>>”将位模式向右移位。 位模式由左侧操作数给出,位置数由右侧操作数移位。 无符号右移运算符“>>>”将零移动到最左侧位置,而“>>”之后的最左侧位置取决于符号扩展。
注意:使用SLIP 30 (2015年11月),Scala可能最终(2016年?2017年?)有4个“原始”类型来表示无符号整数: UByte
, UShort
, UInt
和ULong
。
这会影响UI和ULongs上的位移操作 ,这也说明了>>
和>>>
之间的区别:
左移
<<
和换档逻辑右>>>
在明显的方式表现。移位算术权
>>
情况值得商榷。
我们认为它不应该在无符号整数上可用,原因有两个:
- 首先,移位算术权对无符号整数似乎没有任何意义。 正确的算术移位如果
>>>
。 因此,与unary_-
类似,不应该引入它。- 其次, 具有无符号整数类型的现有语言(例如C族)实际上给
>>
提供了不同的语义,具体取决于它是否具有有符号或无符号操作数 :
无符号操作数上的>>
不符号扩展。 对于一个C开发人员来说,在scala中使用x >> 3
进行签名扩展会让人感到困惑,但对于scx >> 3
开发人员而言,x >> 3
不能签名扩展同样令人困惑。 因此,我们更愿意完全抛弃它,并引发编译器错误。如果一个基于bit-twiddling的算法需要符号扩展右移,则始终可以重新解释为signed,执行操作,并重新解释为unsigned:
(x.toInt >> 3).toUInt
。注意:当前的实现确实提供了
>>
,直到我们就这一点达成一致。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.