Fount Diese Anweisung Eine Null-Breite Bitfeld kann das nächste Feld verursachen auf den nächsten Behälter Grenze ausgerichtet werden, wo der Behälter die gleiche Größe wie die zugrunde liegenden Typ des Bitfeldes istVerschiedene Typen für Nulllängen-Bitfelder in c?
Um es in die Praxis umzusetzen Angenommen int ist 2 Bytes (16 Bits) und diese Abkürzung ist 1 Byte (8 Bits), um das Schreiben zu ersparen. Nehmen wir an, wir benutzen den gcc-Compiler (wäre schön, die Unterschiede zu clang zu erklären).
struct foo {
unsigned int a:5;
unsigned int :0;
unsigned int b:3;
}
In Erinnerung sieht aus wie
struct address
|
|
v
aaaaa000 00000000 bbb00000 00000000
Frage 1: In meinem Verständnis kann es nicht aussehen wie aaaaa000 00000000 0..00bbb00000...
, also bbb
mit dem Behälter auszurichten hat direkt den aktuellen Container folgen. Ist das tatsächlich wahr?
Umzug auf, wenn ich angeben
struct bar {
unsigned short x:5;
unsigned int :0;
unsigned short y:7;
}
Wird es wie so sein?
struct address
| short stops here short starts
| | |
v v | this is uint | v
xxxxx000 00000000 00000000 yyyyyyy0
Edit 1 Es wurde, dass kurz darauf hingewiesen, nicht weniger als 16 Byte sein kann. Das ist etwas neben dem Punkt in dieser Frage. Aber wenn seine für Sie wichtig können Sie short
mit char
ersetzen und int
mit short
Welcher Compiler? Bitfelder haben viele implementierungsspezifische Details. –
@CarlNorum hat die Frage bearbeitet. – user10607
Sogar die Bitfelder werden für die Ausrichtung während der Typumschaltungen aufgefüllt, so dass Ihre Stichprobe nicht stimmt. –