Hallo!
Ich habe versucht, die Operation -3 >>> 5 per Stift und Papier auf Bit-Ebene (binäre Darstellung) nachzuvollziehen. Wichtig: Operanden und Ergebnis jeweils vom Typ byte. Vorgehensweise:
Java allerdings spuckt nicht 7, sondern immer -1 als Ergebnis aus. Warum?
Meine erste Idee: Das Zweier-Komplement der negativen Zahl wird zunächst gebildet, dann geshiftet und anschließend wird das Zweier-Komplement wieder gebildet (naja, eigentlich müsste da aber noch eine 1 addiert werden, dann käme aber nicht mehr das Ergebnis -1 heraus, das auch Java ausspuckt, also hier der Zustand nach dem Invertieren, aber vor dem Addieren der 1, die für das Zweier-Komplement nötig wäre):
Kann mir jemand verraten, wie genau Java beim Verschieben von negativen byte-Werten (Zweier-Komplement) vorgeht? Bin ich mit meinen Vorgehensweisen auf dem richtigen Dampfer? Warum ist -1 und nicht 7 das Ergebnis?
Vielen Dank im Voraus,
DeBukkIt
Ich habe versucht, die Operation -3 >>> 5 per Stift und Papier auf Bit-Ebene (binäre Darstellung) nachzuvollziehen. Wichtig: Operanden und Ergebnis jeweils vom Typ byte. Vorgehensweise:
1111 1101 (-3 per Zweier-Komplement)
>>> 5
0000 0111 (7)
Java allerdings spuckt nicht 7, sondern immer -1 als Ergebnis aus. Warum?
Java:
System.out.println((byte) (((byte) -3) >>> ((byte) 5))); // -1
Meine erste Idee: Das Zweier-Komplement der negativen Zahl wird zunächst gebildet, dann geshiftet und anschließend wird das Zweier-Komplement wieder gebildet (naja, eigentlich müsste da aber noch eine 1 addiert werden, dann käme aber nicht mehr das Ergebnis -1 heraus, das auch Java ausspuckt, also hier der Zustand nach dem Invertieren, aber vor dem Addieren der 1, die für das Zweier-Komplement nötig wäre):
1111 1101 (-3)
Zweier-Komplement
0000 0011 (3)
>>> 5
0000 0000 (0)
Zweier-Komplement ohne +1!!!
1111 1111 (-1)
Kann mir jemand verraten, wie genau Java beim Verschieben von negativen byte-Werten (Zweier-Komplement) vorgeht? Bin ich mit meinen Vorgehensweisen auf dem richtigen Dampfer? Warum ist -1 und nicht 7 das Ergebnis?
Vielen Dank im Voraus,
DeBukkIt