Bitweise Operatoren und "Endianness"

70

Ist Endianness bei den bitweisen Operationen überhaupt wichtig? Entweder logisch oder wechselnd?

Ich arbeite an Hausaufgaben in Bezug auf bitweise Operatoren, und ich kann weder Kopf noch Zahl darauf machen, und ich denke, ich bin ziemlich auf die Endianess fixiert. Das heißt, ich benutze eine kleine Endian-Maschine (wie die meisten), aber muss dies berücksichtigt werden oder ist es eine verschwendete Tatsache?

Falls es darauf ankommt, benutze ich C.

Frank V.
quelle
3
IMHO, das sind etwas andere Fragen. Diese Frage ist wie „ist 128 << 2 == 512auf jeder CPU?“, Diese Frage ist , wie „nicht 128 << 2auslegen , wie 0x02 0x00auf jeder CPU?“.
Kolen

Antworten:

76

Endianness ist nur für das Layout der Daten im Speicher von Bedeutung. Sobald Daten von dem zu bearbeitenden Prozessor geladen werden, spielt die Endianness keine Rolle mehr. Verschiebungen, bitweise Operationen usw. werden unabhängig von der Endianness wie erwartet ausgeführt (Daten logisch als Bit niedriger Ordnung zu hoch angeordnet).

Michael
quelle
22
Sollte es nicht logisch "Bit hoher bis niedriger Ordnung" sein?
Legends2k
1
@ legends2k: hatte den gleichen Gedanken
gmoniava
1
@ legends2k: ja. Linksverschiebung = Multiplikation mit Potenz von 2. Rechtsverschiebung = Division durch Potenz von 2 (mit anderer Rundung als Ganzzahldivision für negative Werte).
Peter Cordes
2
@JoshC: Nein, der PDP-10 würde die Operation nur so ausführen, wie sie logisch für die Daten definiert ist, unabhängig davon, welches Bit wo in seinem Speicher / seinen Registern genau angeordnet ist. Bedenken Sie: Wenn Sie zwei 32-Bit-Ganzzahlen hinzufügen, müssen Sie sich keine Sorgen machen, dass der Prozessor die Daten konvertieren muss, damit die Addition funktioniert (und Sie müssen sich auch nicht um die Reihenfolge der Bits in einem Byte in der Hardware kümmern) ALU macht einfach das "Richtige", weil es so verdrahtet ist, dass es mit seiner Hardware funktioniert. Die Verschiebungen sind auf die gleiche Weise - sie verarbeiten die Daten so, dass die Details der Byte- / Bitreihenfolge der Hardware abstrahiert werden.
mtraceur
1
@JoshC: (Forts.) Und in C werden die Bitverschiebungsoperatoren so definiert, dass sie noch mehr abstrahiert werden: Sie werden anhand der von ihnen erzeugten Werte definiert, nicht anhand der Art und Weise, wie sie die zugrunde liegenden Bits bewegen ( Wenn Sie sich also auf einer obskuren Plattform befinden, auf der ein Hardware-Bitverschiebungsbefehl ein ungültiges Bitlayout erzeugen würde, z. B. wenn Sie ein Wertbit in ein Füllbit verschoben haben, ist ein konformer Compiler erforderlich, um Befehle zu erstellen, die dies umgehen Ich verstehe es).
mtraceur
66

Die bitweisen Operatoren abstrahieren die Endianness. Beispielsweise >>verschiebt der Operator die Bits immer in Richtung der niedrigstwertigen Ziffer. Dies bedeutet jedoch nicht, dass Sie die Endianness sicher ignorieren können, wenn Sie sie verwenden. Wenn Sie beispielsweise einzelne Bytes in einer größeren Struktur bearbeiten, können Sie nicht immer davon ausgehen, dass sie an derselben Stelle liegen.

Zur Verdeutlichung bin ich mit den anderen Antworten hier nicht grundsätzlich nicht einverstanden. Der Punkt, den ich ansprechen möchte, ist zu betonen, dass die bitweisen Operatoren zwar im Wesentlichen endianneutral sind, Sie jedoch den Effekt der Endianess in Ihrem Code nicht ignorieren können, insbesondere wenn Sie ihn mit anderen Operatoren kombinieren.

1800 INFORMATIONEN
quelle
1
Sie sind im Grunde nicht mit allen einverstanden, aber dennoch wurde Ihre Antwort als die beste gewählt. Wie kann das Verhalten identifiziert werden?
Frank V
Ich habe einige weitere Klarstellungen hinzugefügt
1800 INFORMATION
2
Um weiter zu verdeutlichen, meinen Sie, ob alles in Ordnung ist, wenn ich nicht tatsächlich Werte in Bytes abrufe?
Suvarna Pattayil
1
Oo so >> und << verschieben sich überhaupt nicht nach rechts oder links; Sie "verschieben sich in Richtung der niedrigsten Signifikanz und in Richtung der höchstwertigen". das macht "Division und Multiplikation durch Verschiebung" der Endianness unabhängig ... jetzt bin ich verwirrt, wenn das Casting über memcpy dies durcheinander bringen würde.
Dmitry
6

Wie andere bereits erwähnt haben, werden Verschiebungen durch die C-Sprachspezifikation definiert und sind unabhängig von der Endianness. Die Implementierung einer Rechtsverschiebung kann jedoch variieren, je nachdem, ob die Architektur die Komplementarithmetik des eigenen oder des zweiten Komplements verwendet.

rpetrich
quelle
4

Es hängt davon ab, ob. Ohne die Zahl in einen neuen Typ umzuwandeln, können Sie die Endianness transparent behandeln.

Wenn Ihre Operation jedoch einen neuen Gusstyp beinhaltet, gehen Sie vorsichtig vor.

Wenn Sie beispielsweise einige Bits nach rechts verschieben und (explizit oder nicht) in einen neuen Typ umwandeln möchten, ist Endianness wichtig!

Um Ihre Endianness zu testen, können Sie einfach ein intin ein char:

Rongkai Xu
quelle
... oder eine Gewerkschaft gründen ...{union { int i = 1; char a[4];} b;return b.a[3] == 1;} //big endian
2

Sie haben keine Sprache angegeben, aber normalerweise werden Programmiersprachen wie C abstrakte Endianness in bitweisen Operationen entfernt. Also nein, es spielt bei bitweisen Operationen keine Rolle.

mmx
quelle
2
Angesichts der Tatsache, dass die Frage nicht überarbeitet wurde, bin ich überrascht, dass Sie sagen, dass er die Sprache nicht erwähnt hat, wenn er dies tut, und dass sie auch als C. markiert ist
Simeon Pilgrim
2
@Simeon: Es hatte zu dem Zeitpunkt nicht, als ich diese Antwort schrieb. Bearbeitungen eines einzelnen Autors in einem kleinen Zeitrahmen werden zu einem zusammengeführt. Deshalb sehen Sie es als eine einzige Revision.
mmx