2 Pluspunkte 0 Minuspunkte

Ich verstehe nicht ganz was dieser Code macht. Ich dachte der Member x der Struktur B würde dabei auf 1 gesetzt werden weil man ja den = Operator innerhalb des typedef nicht nutzen kann? Aber es scheint trotzdem 0 zu sein.

#include <stdio.h>

typedef struct a {
    int x;
} A;

typedef struct b {
    int x : 1;
} B;

int main(int argc, char **argv) {

    A a = { 2 };
    B b;
    B *c;

    printf("%d, %d, %d", a.x, b.x, c->x);

}
von  

2 Antworten

0 Pluspunkte 0 Minuspunkte

Das ist ein Bitfeld, das :1 bedeutet "1 Bit breit", also sind sie in Ihrem Fall alle booleschen Werte - 0 oder 1. Der Compiler soll dabei die Platznutzung optimieren, indem er mehrere davon in ein Byte (8 Bit) packt. Eine Tag hat maximal 24 Stunden, jede Stunde hat 60 Minuten. Würdest du die 2 Zahlen als Integer speichern würde das 64 Bit verbrauchen. Das ganze kannst du dann in Bitfeldern speichern. Für 24 Stunden benötigt man zumindest 5 Bit (2^5 = 32) und für 60 Minuten zumindest 6 Bit (2^6 = 64). Somit kannst du die beiden Werte in 11 Bit speichern und hast 53 Bit gespart.

#include <stdio.h>

struct time {
 unsigned int hour: 5;
 unsigned int minute: 6;
} timestamp;

int main() {

    timestamp.hour = 13;
    timestamp.minute = 37;

    printf("%02d:%02d\n", ++timestamp.hour, timestamp.minute );

}
von (868 Punkte)  
0 Pluspunkte 0 Minuspunkte

Ein Bitfeld wird verwendet um Speicherplatz zu sparen indem mehrere boolesche Werte oder kleine ganze Zahlen in einem einzigen ganzzahligen Wert gespeichert werden. Ein Bitfeld wird normalerweise innerhalb einer Struktur definiert, wobei jedes Feld eine bestimmte Anzahl von Bits einnimmt. Möchte man zum Beispiel eine Zahl speichern die nie größer als 13 wird, benötigt man dafür 4 Bits (2^4 ist 16). Würde man diese Zahl in einem char speichern wäre das 1 Byte. 1 Byte sind 8 Bit, damit wären 4 Bit verschwendet. Hier ist ein Beispiel, das die Verwendung von Bitfeldern zeigt.

#include <stdio.h>

// Definition einer Struktur mit Bitfeldern
struct BitfieldExample {
    unsigned int flag1 : 1;  // 1 Bit für flag1
    unsigned int flag2 : 1;  // 1 Bit für flag2
    unsigned int value : 4;  // 4 Bits für value (kann Werte von 0 bis 15 speichern)
    unsigned int reserved : 2; // 2 Bits reserviert
};


int main() {

    struct BitfieldExample example;

    // Initialisierung der Bitfelder
    example.flag1 = 1;
    example.flag2 = 0;
    example.value = 9; // 9 ist im Bereich von 4 Bits (0-15)
    example.reserved = 3; // 3 ist im Bereich von 2 Bits (0-3)

    // Ausgabe der Werte
    printf("Flag1: %u\n", example.flag1);
    printf("Flag2: %u\n", example.flag2);
    printf("Value: %u\n", example.value);
    printf("Reserved: %u\n", example.reserved);

    // Überschreiten des Bitbereichs
    example.value = 16; // Überschreitet 4 Bits

    printf("Value nach Überschreitung: %u\n", example.value); // Der Wert wird abgeschnitten

    return 0;

}
von (884 Punkte)