Heim >Backend-Entwicklung >C#.Net-Tutorial >Detaillierte Einführung in die Bitsegmente der C-Sprache
Bitsegment in C-Sprache
Das Bitfeld definiert den von Mitgliedsvariablen in einer Struktur (oder Union) belegten Platz in Biteinheiten. Eine Struktur (Vereinigung), die Bitsegmente enthält, wird als Bitsegmentstruktur bezeichnet. Die segmentierte Struktur kann Platz sparen und die Bedienung erleichtern.
Das Definitionsformat des Bitfelds ist:
Typ [var]: Ziffern
wobei Typ nur int, unsigned int, signiert sein kann Es gibt drei Arten von int (ob der int-Typ negative Zahlen darstellen kann, hängt vom Compiler ab. Beispielsweise ist int in VC standardmäßig vorzeichenbehaftet int, kann negative Zahlen darstellen). Der Bitfeldname var ist ein optionaler Parameter und kann weggelassen werden. Digits stellt die Anzahl der von diesem Bitfeld belegten Binärziffern dar.
Dann kann die Definition einer Bitsegmentstruktur wie im folgenden Code definiert werden:
struct node { unsigned int a:4; //位段a,占4位 unsigned int :0; //无名位段,占0位 unsigned int b:4; //位段b,占4位 int c:32; //位段c,占32位 int :6; //无名位段,占6位 };
1. Verwendung von Bitsegmenten
Bei der Verwendung sind einige Punkte zu beachten Bitsegmente:
1) Der Typ des Bitfelds kann nur int, vorzeichenlos int, vorzeichenbehaftet int sein und darf nicht vom Typ char oder Fließkomma sein.
2) Die von belegten Binärziffern das Bitfeld Die Zahl darf die maximale Anzahl von Ziffern, die durch den Basistyp dargestellt werden können, nicht überschreiten. In VC belegt int beispielsweise höchstens 32 Bits.
3) Auf unbenannte Bitsegmente kann nicht zugegriffen werden, sie belegen jedoch Platz. 4) Die Adressoperation kann nicht für das Bitfeld ausgeführt werden 5) Wenn die Anzahl der von einem Bitfeld belegten Binärstellen 0 beträgt, muss dieses Bitfeld ein unbenanntes Bitfeld sein und das nächste Bitfeld wird in der nächsten Bitfeld-Speichereinheit gespeichert (hier die Anzahl der Bitfeld-Speichereinheiten). wurde in der VC-Umgebung auf 4 getestet) Bytes) werden gespeichert
6) Wenn das Bitfeld im Ausdruck erscheint, wird es automatisch auf den Typ „Integer“ aktualisiert und in den Typ „int“ oder „unsigned“ konvertiert int.
7) Wenn Sie einem Bitsegment einen Wert zuweisen, ist es am besten, den maximalen Bereich, den das Bitsegment darstellen kann, nicht zu überschreiten, da sonst unerwartete Ergebnisse auftreten können.
8) Das Bitfeld darf nicht die Form eines Arrays haben.
2. Wie Bitsegmentstrukturen im Speicher gespeichert werden
Für Bitsegmentstrukturen optimiert der Compiler automatisch den Speicherplatz:
1) Wenn eine Bitsegment-Speichereinheit alle Mitglieder in der unteren Bitsegmentstruktur speichern kann, können alle Mitglieder in der Bitsegmentstruktur nur in einer Bitsegment-Speichereinheit und nicht in zwei Bitsegment-Speichereinheiten platziert werden Wenn eine Bitsegment-Speichereinheit nicht alle Mitglieder in der unteren Bitsegmentstruktur aufnehmen kann, werden die verbleibenden Bitsegmente beginnend mit der nächsten Bitsegment-Speichereinheit gespeichert. (Die Größe der Bitsegment-Speichereinheit in VC beträgt 4 Bytes).
2) Wenn es in einer Bitsegmentstruktur nur ein unbenanntes Bitsegment gibt, das 0 Bits belegt, belegt es nur 1 oder 0 Bytes Platz (0 Bytes in der C-Sprache und 1 Bytes in C++, andernfalls alle anderen). der von einer Bitsegmentstruktur belegte Platz ist mindestens so groß wie eine Bitsegmentspeichereinheit;
Testprogramm:
Das Ausführungsergebnis ist: 1 -1 -2 3/*测试位段 201110.12*/ #include<iostream> using namespace std; typedef struct node { unsigned int a:1; //存在一个非0位的位段,则至少占4Byte }S; typedef struct node1 //在C++中占1字节的空间 ,在C中占0字节 { unsigned int :0; }S1; typedef struct node2 { unsigned int a:1; unsigned int :0; //下一个位段放在一个新的位段存储单元 ,所以占4+4=8Byte unsigned c:32; }S2; typedef struct node3 { unsigned int a:4; unsigned int :0; int :6; //这个位段放在一个新的位段存储单元 unsigned c:32;//由于6+32>32,所位段c也放在一个新的位段存储单元,所以占4+4+4=12Byte }S3; typedef struct node4 { unsigned int a:1; char b; //在一个位段存储单元中能够存下所有的成员,所以占4Byte int c:1; int d:2; unsigned int e:2; }S4; nt main(int argc, char *argv[]) { S4 s4; s4.a=1; s4.c=1; s4.d=2; s4.e=3; printf("%d %d %d %d\n",s4.a,s4.c,s4.d,s4.e); printf("%d %d %d %d %d\n",sizeof(S),sizeof(S1),sizeof(S2),sizeof(S3),sizeof(S4)); return 0; }4 1 8 12 4
Bitte drücken Sie eine beliebige Taste, um fortzufahren.
Beim Drucken jedes Bitfelds von s4 weicht das gedruckte Ergebnis vom zugewiesenen Anfangswert ab.
Da c nur 1 Bit belegt, gibt es kein Datenbit. Zu diesem Zeitpunkt wird eine Vorzeichenerweiterung durchgeführt, um 1 direkt zum High-Bit hinzuzufügen, sodass das gedruckte Ergebnis -1 ist Da d 2 Bits belegt, beträgt der im Speicher gespeicherte Inhalt 10, wenn d 2 zugewiesen wird. Zu diesem Zeitpunkt wird eine Vorzeichenerweiterung durchgeführt und das hohe Bit um 1 ergänzt, dann ist es 0XFF FF FF FE sein wahrer Wert ist -2.
Vielen Dank fürs Lesen, ich hoffe, es kann allen helfen, vielen Dank für Ihre Unterstützung dieser Website!