19 Stimmen

Reihenfolge der Felder beim Verwenden eines Bit-Felds in C

Ich habe eine Struktur vom folgenden Typ

typedef struct
{
unsigned int a : 8;
unsigned int b : 6;
unsigned int c : 2;
}x, *ptr;

Was ich tun möchte, ist den Wert des Feldes c zu ändern.

Ich mache etwas Ähnliches wie das Folgende

x Struktur = { 0 };
x->c = 1;

Wenn ich mir die Speicherkarte anschaue, erwarte ich 00 01 zu finden, aber stattdessen finde ich 00 40. Es scheint, dass beim Anordnen des zweiten Bytes das c-Feld in die niedrigsten Bits und das b-Feld in die höchsten Bits gestellt wird. Ich habe dies bei beiden GCC- und Windows-Compilern gesehen.

Bis jetzt mache ich das Folgende, was gut funktioniert.

unsigned char ptr2 = (unsigned char*) ptr
*(ptr2 + 1)  &= 0xFC
*(ptr2 + 1)  |= 0x01

Schaue ich mir die Speicherkarte falsch an? Vielen Dank für deine Hilfe.

-1voto

Malcolm McLean Punkte 6168

Sie setzen eine C-Struktur auf Rohbits auf eigene Gefahr.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X