Der Operator >>
behält das Vorzeichen (Vorzeichenerweiterungen) bei, während >>>
die Bits ganz links (Nullenerweiterungen) auf Null setzt.
Dies ist nicht notwendig in Sprachen wie C, die signierte und unsignierte Typen haben, im Gegensatz zu Java, das auch >>>
hat (weil es keine Ganzzahlen ohne Vorzeichen hat).
Hinweis: Mit SLIP 30 (Nov. 2015) könnte Scala enden (in 2016? 2017? ) mit 4 "primitiven" Typen, die vorzeichenlose Ganzzahlen darstellen: UByte
, UShort
, UInt
und ULong
.
Das würde Bitverschiebungsoperationen für UInts und ULongs , die auch den Unterschied zwischen >>
und >>>
:
Shift links
<<
und Verschiebung logisch rechts>>>
verhalten sich in der offensichtlichen Weise.Der Fall der Verschiebungsarithmetik rechts
>>
ist umstritten.
Wir argumentieren, dass es für unsigned Ganzzahlen aus zwei Gründen nicht verfügbar sein sollte:
- Zunächst scheint ein shift-arithmetisches Recht keine Bedeutung für unsigned Ganzzahlen zu haben. Die korrekte arithmetische Verschiebung wenn
>>>
. Daher sollte es ähnlich wieunary_-
nicht eingeführt werden.- Zweitens geben vorhandene Sprachen, die unsigned Integer-Typen wie die C-Familie haben,
>>
unterschiedliche Semantiken, je nachdem, ob sie einen signierten oder unsignierten Operanden haben :
A>>
auf einem vorzeichenlosen Operanden wird nicht vorzeichenerweitert. Es wäre für einen C-Entwickler verwirrend, wennx >> 3
in Scala signieren würde, aber es würde für einen Scala-Entwickler ebenso verwirrend sein, dassx >> 3
nicht sign-extend ist. Daher ziehen wir es vor, es komplett wegzulassen und einen Compiler-Fehler auszulösen.Wenn ein Bit-Twiddling-basierter Algorithmus das vorzeichenerweiternde Shift-Recht benötigt, ist es immer möglich, ihn als signiert neu zu interpretieren, die Operation auszuführen und als unsigned neu zu interpretieren:
(x.toInt >> 3).toUInt
.Hinweis: Die aktuelle Implementierung liefert
>>
, bis wir uns in diesem Punkt einig sind.
Sie haben dieselbe Bedeutung wie in Java. Der unterschriebene Linksverschiebungsoperator "& lt; & lt;" verschiebt ein Bitmuster nach links, und der vorzeichenbehaftete Rechtsverschiebungsoperator "& gt; & gt;" verschiebt ein Bitmuster nach rechts. Das Bitmuster wird durch den linken Operanden und die Anzahl der zu verschiebenden Positionen durch den rechten Operanden angegeben. Der vorzeichenlose Rechtsverschiebungsoperator "& gt; & gt; & gt;" Verschiebt eine Null in die äußerste linke Position, während die äußerste linke Position nach "& gt; & gt;" hängt von der Zeichenerweiterung ab.