Kann sich Endianness auf die Bitreihenfolge in einem Byte beziehen?

Lesezeit: 9 Minuten

Benutzeravatar von Meda
Meda

Ich lese „Learning Core Audio: A Hands-On Guide to Audio Programming for Mac and iOS“ von Chris Adamson und an einer Stelle beschreibt der Autor Big-Endian als:

die hohen Bits eines Bytes oder Wortes sind numerisch signifikanter als die niedrigeren.

Bisher dachte ich jedoch, dass das Problem von Big-Little-Endian nur für gilt Byte Ordnung und nicht Bitordnung. Ein Byte hat die gleiche Bitreihenfolge (von links nach rechts), egal ob es sich um Little-Endian- oder Big-Endian-Systeme handelt. Liege ich falsch? Liegt der Autor falsch? Oder habe ich seine Aussage falsch verstanden?

  • Bei Audio bin ich mir nicht sicher, aber bei Video bin ich auf eine typische Frage in einem Interview gestoßen; zum Beispiel in einer Situation, in der Sie möchten, dass ein 32-Bit-Wert in 24 Bit dargestellt wird. dann werden die niedrigeren Bits generell verworfen, da es darauf ankommt, dass die höheren 24 Bits mehr Informationen darstellen/haben. Hat der Autor das irgendwie erwähnt.

    – Adit Ya

    5. April 2018 um 8:01 Uhr

  • Obwohl die Antwort von Michael Burr für Lernende ausreichend ist, gehen andere Antworten auf tiefere Aspekte von Bit-Endian-ness und C ein, insbesondere @Nominal Animal. Da OP seit 2015 nicht mehr hier ist, bezweifle ich, dass sich die ausgewählte Antwort ändern wird.

    – chux – Wiedereinsetzung von Monica

    12. April 2018 um 15:36 Uhr

Da Sie die Bits innerhalb eines Bytes normalerweise nicht einzeln adressieren können, gibt es im Allgemeinen kein Konzept der “Bit-Endianness”.

  • Aber wenn Sie bitweise Operationen wie das Verschieben durchführen, “adressieren” Sie sie nicht?

    – Meda

    29. Mai 2013 um 0:06 Uhr

  • Beim Verschieben behandeln Sie die Bits immer noch als Teil einer größeren Einheit (Byte, Int oder so). Endianess spielt nur eine Rolle, wenn Sie ein größeres Objekt Byte für Byte direkt adressieren können – Sie müssen wissen, wie diese einzeln adressierbaren Bytes innerhalb des größeren Objekts angeordnet sind.

    – Michael Burr

    29. Mai 2013 um 0:08 Uhr

  • @Meda Wenn Sie auf der Ebene der Bitverschiebung eines einzelnen Bytes sind, kann seine “Darstellung” (die Zahl, der es entspricht) zusammenbrechen, und es ist nur eine willkürliche Sammlung von 1 und 0. So abstrakt wie die Zahlen selbst sind auch die weitergegebenen Anweisungen zum Rotieren (ROL, ROR, RCL, RCR) oder Verschieben (SHL, SHR…) in eine bestimmte “Richtung”.

    – Nik T

    29. Mai 2013 um 0:20 Uhr


  • @Meda: Bitweise Operationen arbeiten in Bezug auf Bitpositionen in der abstrakten binären Darstellung einer Zahl, nicht in Bezug auf physische Maschinenbits. Aus diesem Grund sind sie völlig unabhängig von Endianness. Nichts hindert diese Operationen daran, in ternären Maschinen zu existieren, die überhaupt keine physischen Bits haben. In C wird das Verschieben eines positiven Werts um 1 Bit nach links immer garantiert mit 2 multipliziert, unabhängig von der Endianness.

    – AnT steht zu Russland

    29. Mai 2013 um 2:52 Uhr


  • Nur wenn Sie keine Systemprogrammierung durchführen.

    – Galaxie

    16. September 2018 um 3:56 Uhr

Benutzeravatar von Nominal Animal
Nominelles Tier

Dies ist keine Antwort auf die gestellte Frage – sie wurde bereits von anderen gut beantwortet –, sondern eine Fußnote, die einige der Begriffe erklärt, in der Hoffnung, dass sie die damit verbundenen Konzepte verdeutlicht. Insbesondere ist dies überhaupt nicht spezifisch für c.


  • Endianness und Byte-Reihenfolge

    Wenn ein Wert größer als Byte gespeichert oder in mehrere Bytes serialisiert wird, wird die Wahl der Reihenfolge aufgerufen, in der die Komponentenbytes gespeichert werden Byte-Reihenfolgeoder endianoder Endianität.

    In der Vergangenheit wurden drei Byte-Ordnungen verwendet: Big-Endian, Little-Endianund PDP-endian oder Mittel-Endian.

    Big-Endian und Little-Endian Byte-Reihenfolge-Namen werden von der Art und Weise abgeleitet, wie sie die Bytes anordnen: Big-Endian setzt das höchstwertige Byte (das Byte, das den logischen Wert am meisten beeinflusst) an die erste Stelle, wobei die nachfolgenden Bytes in absteigender Reihenfolge der Signifikanz angeordnet sind; und Little-Endian setzt das niederwertigste Byte zuerst, mit aufeinanderfolgenden Bytes in aufsteigender Reihenfolge der Signifikanz.

    Beachten Sie, dass die Byte-Reihenfolge für Integer-Typen und abweichen kann Fließkommatypen; sie können sogar in getrennten Hardwareeinheiten implementiert werden. Auf der meisten Hardware haben sie jedoch die gleiche Byte-Reihenfolge.

  • Bit-Reihenfolge

    Die Bitreihenfolge ist dem Endianness-Konzept sehr ähnlich, außer dass es sich um einzelne Bits und nicht um Bytes handelt. Die beiden Konzepte sind verwandt, aber nicht identisch.

    Die Bitreihenfolge ist nur sinnvoll, wenn Bits serialisiert werden, beispielsweise über eine serielle oder SPI oder I2C-Bus; einer nach demanderen.

    Wenn Bits in einer größeren Gruppe bezeichnet werden als eine Einheit parallel verwendet werdenwie in einem Byte oder einem Wort, gibt es keine Reihenfolge: Es gibt nur Beschriftung und Bedeutung. (Weil auf sie parallel und nicht seriell einzeln zugegriffen und als Gruppe bearbeitet wird, gibt es keine bestimmte Reihenfolge. Ihre Interpretation als Gruppe verleiht jedem eine unterschiedliche Bedeutung, und wir Menschen können sie benennen oder nummerieren Leichte Referenz.)

  • Bit-Bedeutung

    Wenn eine Gruppe von Bits als Binärwert behandelt wird, gibt es a niedrigstwertige Bitund ein höchstwertiges Bit. Diese Namen leiten sich daraus ab, dass sich der Wert der Bitgruppe bei Änderung des niederwertigsten Bits um den kleinstmöglichen Betrag ändert; wenn Sie das höchstwertige Bit ändern, ändert sich der Wert der Bitgruppe um den größtmöglichen Betrag (um eine einzelne Bitänderung).

    Nehmen wir an, Sie haben eine Gruppe von fünf Bits a, b, c, dund e, die einen 5-Bit-Ganzzahlwert ohne Vorzeichen bilden. Wenn a ist das bedeutendste, und e der am wenigsten signifikante, und die drei anderen sind in der Reihenfolge abnehmender Bedeutung, der unsigned Integer-Wert ist

    Wert = a·24 + b·23 + c·22 + d·21 + e·20

    dh

    Wert = 16a + 8b + 4c + 2d + z

    Mit anderen Worten, bisschen Bedeutung wird von der mathematischen (oder logischen) Interpretation einer Gruppe von Bits abgeleitet und ist vollständig unabhängig von der Reihenfolge, in der die Bits auf einem Bus serialisiert werden könnten, und auch von allen vom Menschen zugewiesenen Etiketten oder Zahlen.

    Dies gilt für alle Bitgruppen, die Zahlenwerte logisch aufbauen, auch z Fließkommazahl Zahlen.

  • Bit-Labels oder Bit-Nummerierung

    Zum besseren Nachschlagen beispielsweise in der Dokumentation ist es oft sinnvoll, die einzelnen Bits zu beschriften. Dies ist im Wesentlichen willkürlich; und tatsächlich habe ich Buchstaben verwendet a zu f in einem Beispiel oben. Zahlen sind oft einfacher als Buchstaben – es ist nicht so einfach, mehr als 27 Bits mit einzelnen Buchstaben zu beschriften.

    Es gibt zwei Ansätze, um Bits mit Zahlen zu kennzeichnen.

    Am gebräuchlichsten ist derzeit die Bezeichnung der Bits nach ihrer Wertigkeit, wobei sich Bit 0 auf das niederwertigste Bit bezieht. Das ist nützlich, weil bisschen ich hat dann den logischen Wert 2ich.

    In der Dokumentation bestimmter Architekturen, wie z. B. der POWER-Dokumentation von IBM, ist das höchstwertige Bit in absteigender Reihenfolge der Wertigkeit mit 0 gekennzeichnet. In diesem Fall hängt der logische Wert eines Bits von der Anzahl der Bits in dieser Einheit ab. Wenn eine Einheit hat N Bits, dann Bits ich hat den logischen Wert 2N-i-1.

    Während sich diese Reihenfolge seltsam anfühlen mag, sind diese Architekturen alle Big-Endian, und es könnte für Menschen nützlich sein, sich einfach daran zu erinnern/anzunehmen das bedeutendste kommt zuerst auf diesen Systemen.

    Denken Sie jedoch daran, dass dies eine völlig willkürliche Entscheidung ist und in beiden Fällen die Dokumentation mit geschrieben werden könnte Sonstiges Bit-Labeling-Schema, ohne Auswirkungen auf die reale Leistung der Systeme. Es ist wie die Wahl, ob man von links nach rechts oder von rechts nach links (oder von oben nach unten) schreibt: Der Inhalt bleibt unberührt, solange Sie die Konvention kennen und verstehen.

Obwohl es eine gewisse Korrelation zwischen der Byte-Reihenfolge und der Bit-Kennzeichnung gibt, sind alle vier oben genannten Konzepte getrennt.

Es gibt eine Korrelation zwischen der Byte-Reihenfolge und der Bit-Kennzeichnung – in dem Sinne, dass die Dokumentation für viele Big-Endian-Hardware eine Bit-Kennzeichnung verwendet, bei der das höchstwertige Bit Bit Null ist –, aber das liegt nur an Entscheidungen, die von Menschen getroffen wurden.

In c variiert die Reihenfolge, in der der C-Compiler Bitfelder in eine Struktur packt, zwischen Compilern und Architekturen. Es wird von der C-Norm überhaupt nicht spezifiziert. Aus diesem Grund ist es normalerweise keine gute Idee, Binärdateien in einen Strukturtyp mit Bitfeldern einzulesen. (Selbst wenn es auf einem bestimmten Computer und Compiler funktioniert, gibt es keine Garantie, dass es auf anderen funktioniert; oft tut es das nicht. Also macht es den Code definitiv weniger portabel.) Lesen Sie stattdessen in einen Puffer und ein Array von unsigned charund verwenden Sie den Helfer Accessor Funktionen zum Extrahieren der Bitfelder aus dem Array mithilfe von Bitverschiebungen (<<, >>), binäres Oder (|) und Maskierung (binär und &).

Der einzige Sinn, in dem es so etwas wie “Bitreihenfolge” gibt, ist die Reihenfolge, in der Bits Bitfeldern zugewiesen werden. Zum Beispiel bei:

union {
    struct {
        unsigned char a:4;
        unsigned char b:4;
    } bf;
    unsigned char c;
};

je nach Implementierung, die Darstellung von bf.a könnte die hohen vier Bits besetzen coder die niedrigen vier Bits von c. Ob die Reihenfolge der Bitfeldmitglieder mit der Bytereihenfolge übereinstimmt, ist implementierungsdefiniert.

Benutzeravatar von Anthony
Antonius

Die “Endianness” eines Bytes in Bezug auf die Bitreihenfolge ist nicht wirklich ein Problem, es sei denn, Sie arbeiten mit einem exotischen System, mit dem Sie Bits separat adressieren können. Bei der Entscheidung, wie Daten über das Kabel übertragen werden, kann dies ein Problem darstellen, aber diese Entscheidung wird normalerweise auf Hardwareebene getroffen.

Audio

In Bezug auf die Relevanz für Audio-Streaming, könnte sehr wichtig sein. Die Hardware, die für die Umwandlung des digitalen Audiostroms in analoge Audiosignale verantwortlich ist, kann erwarten, dass die Bits im Strom in einer bestimmten Reihenfolge vorliegen. Wenn sie falsch liegen, kann der Ton völlig durchgeknallt sein. Vielleicht geht der Autor Ihres Buches darauf ein? Wie ich bereits erwähnt habe, wird dies normalerweise auf Hardwareebene entschieden und ist nicht wirklich ein Problem, wenn auf Benutzer- oder sogar auf Kernelebene programmiert wird. Im Allgemeinen definieren Industriestandards, wie zwei Hardwarekomponenten die Daten aneinander übertragen. Solange sich Ihre gesamte Hardware auf die Bit-Endianness einig ist, ist alles in Ordnung.

Weiterlesen bei Wikipedia.

Die Reihenfolge der Bits in einem Byte ist nicht sinnvoll, Bits in einem Byte sind nicht adressierbar, daher können Sie keine Reihenfolge dieser Bits definieren, um sie als Referenz für eine Definition von Endianness zu verwenden. Im Gegensatz zu Bits sind Bytes adressierbar, daher gibt es eine Adressreihenfolge, die wir als Referenz verwenden können, um zu definieren, was Little oder Big Endian bedeutet.

Vielleicht haben Sie den Eindruck, dass Left shift << oder Right Shift >> bitweise Operatoren implizieren indirekt, dass es eine definierte Reihenfolge von Bits in einem Byte gibt, aber das stimmt nicht. Diese beiden Begriffe basieren auf einer abstrakten Byte-Darstellung, bei der sich das niedrigste Bit rechts befindet und die Bits einen höheren Wert erhalten, wenn sie nach links gehen, aber per Definition Left shift hat den gleichen Effekt wie die Multiplikation mit 2, und Right shift hat den gleichen Effekt wie die Division durch 2 (für vorzeichenlose Ganzzahlen).

1394030cookie-checkKann sich Endianness auf die Bitreihenfolge in einem Byte beziehen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy