Reihenfolge der Felder bei Verwendung eines Bitfeldes in C

8

Ich habe eine Struktur des folgenden Typs

%Vor%

Was ich tun möchte, ist, den Wert von Feld c zu ändern.

Ich mache etwas wie das folgende

%Vor%

Wenn ich mir die Speicherkarte anschaue, erwarte ich 00 01 , aber stattdessen finde ich 00 40 . Es sieht so aus, als ob beim Anordnen des zweiten Bytes das Feld c in die niedrigsten Bits und das b Feld in die höchsten Bits gesetzt wird. Ich habe das sowohl auf GCC- als auch auf Windows-Compilern gesehen.

Was ich jetzt tue, ist folgendes, was in Ordnung ist.

%Vor%

Betrachte ich die Speicherkarte falsch? Danke für Ihre Hilfe.

    
fashasha 15.10.2013, 08:25
quelle

4 Antworten

13
Der Standard

C ermöglicht es dem Compiler, Bitfelder in beliebiger Reihenfolge zu setzen. Es gibt keine zuverlässige und portable Möglichkeit, die Reihenfolge zu bestimmen.

Wenn Sie die genauen Bitpositionen kennen müssen, verwenden Sie besser die einfache unsignierte Variablen- und Bitmaskierung.

Hier ist eine mögliche Alternative zur Verwendung von Bit-Feldern:

%Vor%     
user694733 15.10.2013, 08:41
quelle
1

Ich weiß, das ist ein alter, aber ich möchte meine Gedanken hinzufügen.

  1. Header in C sind für die Verwendung über Objekte hinweg gedacht, was bedeutet, dass der Compiler einigermaßen konsistent sein muss.

  2. Nach meiner Erfahrung habe ich immer Bitfelder in LSB-Reihenfolge gesehen. Dies setzt die Bits in die MSB- & gt; LSB-Reihenfolge von c: b: a

Die 16 Bits, gelesen in Byte-Reihenfolge, sind "00 40". Aus Little-Endian übersetzt, ist dies ein 16-Bit-Wert von 0x4000.

Das ist:

%Vor%     
jrelles 13.10.2016 02:06
quelle
0

Speicher hängt immer von der zugrunde liegenden Maschinenstruktur (Endianness) und von der Strategie zum Packen / Arrangieren der Struktur ab, die der Compiler ausführt.

    
Peter Miehle 15.10.2013 08:36
quelle
0

Sie setzen eine C-Struktur in Ihrer eigenen Gefahr auf rohe Bits.

Sie wissen, dass die Bits und was sie bedeuten, also können Sie die Felder der Struktur ausfüllen. Ja, es ist mehr Code als memcpy, aber es wird nicht brechen, wenn jemand ein Feld hinzufügt, und wenn es hilft, die Spezifität auf der Ebene der Kommunikation auf der Kommunikationsebene zu erzwingen.

    
Malcolm McLean 21.02.2017 10:13
quelle