Das Ende einer bit-Feld ist das am meisten bedeutende bit?
Ich Schreibe ein C++ - Anwendung für Windows XP/Vista/7 mit Visual Studio 2008. Einige meiner Strukturen verwenden, ein bit-Feld, wie im Beispiel gezeigt.
typedef struct myStruct_tag
{
BYTE myVar1;
WORD myVar2;
WORD myVar3;
union
{
struct
{
BYTE :1;
BYTE field1 :1;
BYTE field2 :1;
BYTE reserved :5;
} myBitField;
BYTE myVar4;
};
BYTE myVar5;
BYTE myVar6;
} myStruct_t;
Dem Ende des Feldes ist das höchstwertige bit?
- Hinweis: Nach dem standard, der MSB ist nicht definiert. Auf einer bestimmten Plattform, vermute ich, dass
reserved
enthält das MSB, aber ich bin nicht positiv. - Das sieht aus wie eine Antwort für mich.
- Äh... Das ist eine eher seltsame Frage. Sie haben nur 3-bit-Felder in Ihrer Erklärung. 2 von Ihnen sind 1-bit-Felder, d.h. es gibt keine Ausgabe von "das Ende" mit Ihnen, da gibt es nur 1 bit gibt. Die nur multi-bit bit-Feld namens
reserved
, was darauf schließen lässt, dass es überhaupt nicht genutzt. Also, im Grunde, die nur bit-Feld Frage anwenden können, istreserved
. Fragen Sie überreserved
speziell? Wenn nicht, klären Sie Ihre Frage. - Wenn ich war positiv w.r.t. die variable bekommt die MSB-es hätte eine Antwort, aber ich bin nicht positiv...
- Dies ist wichtig, da die Struktur verwendet wird, um zu definieren, ein Paket für die serielle Kommunikation. Die bit-Felder müssen ausgerichtet werden auf beiden Seiten des Systems, von der ich leider die Kontrolle über nur eine Seite.
- Haben Sie irgendwelche Vorschläge, wo ich suchen kann Bestätigung? Ein link wäre hilfreich.
- Äh.. versuchen auf 1 Seite und sehen, ob es funktioniert; wenn nicht, versuchen Sie, auf der anderen Seite lol.
Du musst angemeldet sein, um einen Kommentar abzugeben.
C99-standard 6.7.2.1/10 (Hervorhebung von mir):
So, die Bestellung muss dokumentiert werden, von Ihrem compiler-Implementierung.
Allerdings so viel darüber, wie bitfields sind umgesetzt werden die Umsetzung festgelegt oder nicht angegeben ist, dass mit Ihnen zu Modell, hardware -, wire-protocol, Datei-format, bit-Felder in einem tragbaren Mode ist nicht der Mühe Wert zu versuchen.
Wenn Sie möchten, dass Ihre 'bit-Felder' zu Modell etwas externen Programm (wie die oben genannten Dinge), verwenden Sie die explizite Masken, das setzen und löschen der bits unter Verwendung der standard-bit-wise Operatoren (
|
, '&,
~,
<<`, etc.). Verwenden Helfer inline-Funktionen (Makros oder auch wenn Sie müssen), um diese leichter/klarer in Ihrem code.Visual Studio 2008-compiler docs zeigen:
Vom "C++ Bit-Felder", MSDN Sprache C++ Referenz, Visual Studio 2008 version
Wenn Sie Fragen, über welche bits in myBitField gespeichert werden, in der die bits des byte im Speicher, das explizit undefiniert durch die C-standards. Du musst lernen durch Experimentieren. Es ist wahrscheinlich lohnt sich, wenn du etwas tust, wo das wirklich wichtig ist, um stattdessen ein Ansatz, wo man #define
field1
als hex-Wert (z.B.0x40
oder0x02
) und setzte es, wo Sie es wollen.myVar4
, dann ordnen Sie 1 bisfield1
und drucken Sie das resultierende Wert vonmyVar4
. Ich würde hängen, einen Namen auf den ungenutzten bit, die Sie definiert haben, bevorfield1
, obwohl, damit der compiler optimiert es Weg.