2017-09-21 1 views
-1

So habe ich ein bitfield wie so:Bedeutet das Setzen eines 1 Bit breiten Bitfeldes auf 2, dass das Bitfeld gesetzt oder nicht gesetzt ist?

unsigned int foobar:1; 

Und dann stelle ich es diesen Code

uint32_t code = loadCode(); 
structure.foobar = code & 2; 

So verwenden, wenn code-2 gesetzt ist, würde dies bedeuten, dass foobar auf 1 gesetzt ist , 0 oder undefiniert? Die genaue Standard ich verwende ist eigentlich C++ 11, nicht ebene C.

+0

Sieht für mich so aus wäre eine Null ... Denken Sie darüber nach. 2 = 0000010. Ihr Bitfeld ist ein Bit. Wenn Sie UND das gegen Ihren binären Wert, wird dieses Bit noch gelöscht. –

+0

BTW, dies ist keine Hausaufgabe, das wurde aus einer Code-Überprüfung herausgeholt, als wir realisierten, dass niemand in unserem Team weiß, ob dies ein normal definiertes Verhalten ist oder nicht, unsicher warum der Downvote. – Earlz

+0

@DavidHoelzer das ist auch meine Meinung, aber dann hat C++ seltsame Semantik mit booleschem Casting (zB 'x> 0 = true'), das könnte auch für Bitfelder gelten. – Earlz

Antwort

7

[expr.ass]/6:

Wenn der linke Operand eines Zuweisungsoperator ein Bitfeld ist, dass nicht den Wert darstellen kann Der Ausdruck, der resultierende Wert von Das Bitfeld ist implementierungsdefiniert. Ähnlich

, für initialization:

Wenn ein Bit-Feld mit einem Wert initialisiert wird, dass es nicht darstellen kann, der resultierende Wert des Bit-Feld ist die Implementierung definiert.

Dies wird von DR 1816 hinzugefügt. Als Fehlerbericht, der einen Fehler im Standard behebt, ist er de facto rückwirkend.

+0

Ich sehe das nicht in der C++ 11 Spezifikation, ist das von einer späteren Spezifikation? [expr.ass]/6 in C++ 11 ist * "Wenn der linke Operand eines Zuweisungsoperators eine Referenz auf T bezeichnet, ordnet die Operation dem Objekt vom Typ T zu, das durch die Referenz bezeichnet wird." * – cdhowie

+1

Sieht so aus ist [DR1816] (http://wg21.link/CWG1816). –

+0

Ah, also wurde das in C++ 14 behoben? Ich denke dann, dass für C++ 11 die Antwort lautet: "Es kommt darauf an, wie Sie die Spezifikation lesen?" – cdhowie

Verwandte Themen