2013-05-28 10 views
14

lese ich "Learning Core Audio: Eine Hands-On Guide to Audio-Programmierung für Mac und iOS" von Chris Adamson und an einer Stelle beschreibt der Autor Big-Endian als:Kann sich die Endiannität auf die Reihenfolge der Bits in einem Byte beziehen?

die hohen Bits eines Byte oder Wort sind numerisch signifikanter als die unteren.

Doch bis jetzt habe ich allerdings das Problem der großen Little-Endian gilt nur für Byte Ordnung und nicht Bitreihenfolge. Ein Byte hat die gleiche Bit-Reihenfolge (von links nach rechts), egal ob es sich um Little-Endian- oder Big-Endian-Systeme handelt. Liege ich falsch? Ist der Autor falsch? Oder habe ich seinen Standpunkt missverstanden?

Antwort

12

Da Sie normalerweise die Bits innerhalb eines Bytes nicht einzeln adressieren können, gibt es im Allgemeinen kein Konzept von "Bit-Endian".

+2

Aber wenn Sie bitweise Operationen wie Verschieben ausführen, "adressieren" Sie sie nicht? – Meda

+3

Beim Verschieben behandeln Sie immer noch die Bits als Teil einer größeren Einheit (Byte, int oder etwas). Endianess ist nur dann von Bedeutung, wenn Sie ein größeres Objekt byteweise direkt adressieren können - Sie müssen wissen, wie diese individuell adressierbaren Bytes innerhalb des größeren Objekts angeordnet sind. –

+3

@Meda, wenn Sie auf der Ebene der Bit-Shifting ein einzelnes Byte ist es "Darstellung" (die Zahl, die es entspricht) kann zusammenbrechen und es ist nur eine willkürliche Sammlung von 1 und 0 ist. Die Anweisungen rotieren (ROL, ROR, RCL, RCR) oder verschieben (SHL, SHR ...) in einer bestimmten "Richtung" sind so abstrakt wie die Zahlen selbst. –

7

Der einzige Sinn, in dem es so etwas wie "Bit-Reihenfolge" gibt, ist die Reihenfolge, in der Bits Bitfeldern zugewiesen werden. Zum Beispiel in:

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

abhängig von der Implementierung, die Darstellung von bf.a konnte die hohe vier Bits c, oder die niedrigen vier Bits c besetzen. Ob die Reihenfolge der Bitfeldelemente mit der Byte-Reihenfolge übereinstimmt, ist implementierungsdefiniert.

6

Die "Endianness" eines Bytes in Bezug auf Bit-Reihenfolge ist nicht wirklich ein Problem, es sei denn, Sie arbeiten mit einem exotischen System, mit dem Sie Bits separat adressieren können. Es kann ein Problem sein, wenn Sie entscheiden, wie Daten über die Leitung übertragen werden, aber diese Entscheidung wird normalerweise auf Hardwareebene getroffen.

Audio

Im Hinblick auf die Relevanz für Audio-Streaming, könnte es sehr gut wichtig sein. Die Hardware, die für die Umwandlung des Stroms von digitalem Audio in analoge Audiosignale verantwortlich ist, kann erwarten, dass die Bits in dem Strom in einer bestimmten Reihenfolge sind. Wenn sie sich irren, könnte der Sound komplett ausfallen. Vielleicht geht der Autor Ihres Buches darauf ein? Jedenfalls, wie ich bereits erwähnt habe, wird dies normalerweise auf Hardwareebene entschieden und ist nicht wirklich ein Problem beim Programmieren bei einem Benutzer oder sogar einer Kernel-Ebene. Im Allgemeinen definieren Industriestandards, wie zwei Hardwareteile die Daten untereinander übertragen. Solange die Hardware mit der Bit-Endianität übereinstimmt, ist alles in Ordnung.

Further reading at Wikipedia.

+0

+1 für die Angabe der seriellen Übertragungsreihenfolge. Dies ist nicht direkt relevant für die Sprache C, ist aber natürlich für viele Anwendungen von C. relevant. –

2

Die Reihenfolge der Bits in einem Byte ist nicht sinnvoll, die Bits in einem Byte sind nicht adressierbar, so dass Sie nicht einen Auftrag dieser Bits definieren für eine Definition von Endian es als Referenz 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.

Sie können den Eindruck bekommen, dass Left shift << oder Right Shift >> bitweisen Operatoren indirekt implizieren, 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 das niedrigste Bit rechts und Bits nach links höher sind, aber Left shift hat per Definition den gleichen Effekt wie Multiplikation mit 2, und Right shift hat den gleichen Effekt wie Division um 2 (für vorzeichenlose Ganzzahlen).