Martin Molch: Bitweise Verschiebung in Perl und JavaScript

Wie kommt es, dass der Java-Script-Befehlslauf:

x = -391880660;
y = (x >> 16);
alert(y);

in Perl einen anderen Wert ausgibt?

$x = -391880660;
$y = ($x >> 16);
print $y;

Ich habe herausgefunden, dass die Bitverschiebung positiver Zahlen
in JavaScript gleich ist wie in Perl; bei negativen Werten stehen
andere Ergebnisse...

Vielen Dank im Voraus, ciao, Martin.

  1. Ich setze jetzt mal voraus, das -391880660 in keiner der Sprachen einen Overflow (long int ?) oder so was erzeugt (dafür bin ich heute schon zu müde), daher vermute ich folgendes:

    1. kurze Antwort:
    einmal wird _logisch_ verschoben und einmal _arithmetisch_. Bei positiven Zahlen liefern beide Verfahren das gleiche Ergebnis, bei negativen (wie festgestellt) nicht.

    2. lange Antwort:
    Eine negative Zahl wird binär dadurch gekennzeichnet, das das höchstwertige Bit gesetzt (d.h. 1) ist. Für jedes Bit das nach rechts 'aus der Zahl heraus geschoben wird' (d.h. es fällt heraus) wird an der höchstwerigen (linken) Stelle ein ungesetztes Bit (0) nachgeschoben.

    10011101  um eine Stelle nach rechts geschoben ergibt:
    01001110

    Beim arithmetischen Rechtsschieben (SAR) wird der Wert um die angegebene Anzahl Stellen nach rechts verschoben unter berücksichtigung des Vorzeichens. D.h. das höchstwertige Bit wird nach der Operation gesetzt wenn es im Ausgangswert ebenfalls gesetzt war.
    zB:
    10011101
    01001110  um eine Stelle nach rechts verschoben
    11001110
    ^nachdem es vorher gesetzt war, wieder setzen

    Beim logischen Rechtsschieben (SHR) passiert im Prinzip das Selbe, aber da ja für jedes Bit das rechts hinausgeschoben wird links eine Null nachgeschoben wird verliert der Wert sein Vorzeichen.
    zB:
    10011101
    01001110  um eine Stelle nach rechts verschoben
    ^kein Setzen des höchstwerigen Bits
    -> plötzlich haben wir eine positive Zahl (die noch dazu nicht mal mehr mit der negativen ident ist)

    Wer was macht köntest du leicht überprüfen:
    Da rechtsschieben um eine Stelle einer Division durch 2 entspricht [1] ergibt sich wenn arithmetisch verschoben wird:

    -4 >> 1 = -2

    [1] genau lautet es: Division durch 2^n (wobei n die Anzahl Stellen ist, um die verschoben wird)

    MfG McNavc