Champ de bits C
Si la structure du programme contient plusieurs commutateurs, il n'y a que des variables VRAI/FAUX, comme suit :
struct{ unsigned int widthValidated; unsigned int heightValidated;} status;
Cette structure nécessite 8 octets d'espace mémoire, mais en fait, dans chaque Dans chaque variable , nous ne stockons que 0 ou 1. Dans ce cas, le langage C offre une meilleure façon d’utiliser l’espace mémoire. Si vous utilisez une telle variable dans une structure, vous pouvez définir la largeur de la variable pour indiquer au compilateur que vous n'utiliserez que ces octets. Par exemple, la structure ci-dessus peut être réécrite comme :
struct{ unsigned int widthValidated : 1; unsigned int heightValidated : 1;} status;
Maintenant, dans la structure ci-dessus, la variable d'état occupera 4 octets d'espace mémoire, mais seulement 2 bits sont utilisés pour stocker la valeur. Si vous utilisez 32 variables, chaque variable a une largeur de 1 bit, alors la structure d'état utilisera 4 octets, mais dès que vous utilisez une variable supplémentaire, si vous utilisez 33 variables, elle allouera la section de mémoire suivante à stocker. la 33ème variable, 8 octets seront utilisés à ce moment. Regardons l'exemple suivant pour comprendre ce concept :
#include <stdio.h>#include <string.h>/* 定义简单的结构 */struct{ unsigned int widthValidated; unsigned int heightValidated;} status1;/* 定义位域结构 */struct{ unsigned int widthValidated : 1; unsigned int heightValidated : 1;} status2; int main( ){ printf( "Memory size occupied by status1 : %d\n", sizeof(status1)); printf( "Memory size occupied by status2 : %d\n", sizeof(status2)); return 0;}
Lorsque le code ci-dessus est compilé et exécuté, il produira les résultats suivants :
Memory size occupied by status1 : 8Memory size occupied by status2 : 4
Déclaration de champ de bits
Bitfields sont déclarées au sein d'une structure sous la forme suivante :
struct{ type [member_name] : width ;};
Voici une description des éléments variables dans un bitfield :
元素 | 描述 |
---|---|
type | 整数类型,决定了如何解释位域的值。类型可以是整型、有符号整型、无符号整型。 |
member_name | 位域的名称。 |
width | 位域中位的数量。宽度必须小于或等于指定类型的位宽度。 |
Les variables avec des largeurs prédéfinies sont appelées Bitfield. Les champs de bits peuvent stocker plus d'un chiffre. Par exemple, si vous avez besoin d'une variable pour stocker des valeurs de 0 à 7, vous pouvez définir un champ de bits d'une largeur de 3 bits, comme suit :
struct{ unsigned int age : 3;} Age;
. La définition de structure ci-dessus indique au compilateur C que la variable age n'utilisera que 3 bits pour stocker cette valeur, et si vous essayez d'utiliser plus de 3 bits, cela ne fonctionnera pas. Regardons l'exemple suivant :
#include <stdio.h>#include <string.h>struct{ unsigned int age : 3;} Age;int main( ){ Age.age = 4; printf( "Sizeof( Age ) : %d\n", sizeof(Age) ); printf( "Age.age : %d\n", Age.age ); Age.age = 7; printf( "Age.age : %d\n", Age.age ); Age.age = 8; printf( "Age.age : %d\n", Age.age ); return 0;}
Lorsque le code ci-dessus est compilé, il sera accompagné d'un avertissement. Lorsque le code ci-dessus est exécuté, il produira les résultats suivants :
Sizeof( Age ) : 4Age.age : 4Age.age : 7Age.age : 0