array - c++ when to use bitfields




8 logische Wahr/Falsch-Werte innerhalb von 1 Byte speichern? (3)

Ich arbeite an einem Mikrocontroller mit nur 2 KB SRAM und muss dringend etwas Speicher sparen. Ich versuche herauszufinden, wie ich 8 0 / 1 Werte mit einem Bitfeld in ein einzelnes Byte setzen kann, kann es aber nicht ganz herausfinden.

struct Bits
{
    int8_t b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1;
};

int main(){
    Bits b;
    b.b0 = 0;
    b.b1 = 1;

    cout << (int)b.b0; // outputs 0, correct
    cout << (int)b.b1; // outputs -1, should be outputting 1
}

Was gibt?


Alle Ihre Bitfield-Mitglieder sind vorzeichenbehaftete 1-Bit-Ganzzahlen. Auf einem Zweierkomplementsystem bedeutet dies, dass sie nur entweder 0 oder -1 . Verwenden Sie uint8_t wenn Sie 0 und 1 :

struct Bits
{
    uint8_t b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1;
};

Vorzeichenlose und vorzeichenlose ganze Zahlen sind die Antwort.

Denken Sie daran, dass die Signalisierung nur eine Interpretation von Bits ist, -1 oder 1 nur der 'Print'-Serialisierer, der den "Variablentyp" interpretiert, da dieser durch den Compiler für Cout-Funktionen "aufgedeckt" wurde (Look-Operator-Überladung) das gleiche gilt auch für seinen wert (on / off) - da hast du nur 1 bit.

Das ist egal, aber es ist eine gute Praxis, explizit zu sein. Deshalb deklarieren Sie Ihre Variable lieber mit "ohne Vorzeichen". Der Compiler wird angewiesen, einen korrekten Code einzuhängen, wenn Sie den Wert auf einen Serializer wie "print" (cout) setzen oder übertragen ).

OPERATORÜBERLADUNG "COUT": "cout" durchläuft eine Reihe von Funktionen, die der Parameterüberladung den Compiler anweist, welche Funktion aufzurufen ist. Es gibt also zwei Funktionen, von denen eine eine vorzeichenlose und eine andere vorzeichenbehaftete empfängt, sodass dieselben Daten unterschiedlich interpretiert werden können. Sie können sie ändern und den Compiler anweisen, eine andere Funktion mit cast aufzurufen. Siehe cout << myclass


Zur Vorsicht: Der Standard erzwingt ein Implementierungsschema für Bitfelder nicht wirklich. Es gibt keine Garantie, dass die Bits 1 Byte groß sind, und theoretisch ist es durchaus möglich, dass sie größer sind.

In der Praxis folgen die tatsächlichen Implementierungen jedoch normalerweise der offensichtlichen Logik und es wird "fast immer" eine Größe von 1 Byte haben, aber es gibt auch keine Anforderung, dass dies garantiert ist. Nur für den Fall, dass Sie sicher sein möchten, können Sie es manuell tun .

BTW -1 ist immer noch true aber es ist -1 != true





bit-fields