Les champs de bits (bit fields) en C sont des membres de structure qui occupent un nombre spécifié de bits au lieu de la taille standard du type. Ils permettent d'économiser de la mémoire, notamment pour le stockage de drapeaux et de jeux d'états compacts.
Déclaration :
struct Flags { unsigned int enable : 1; unsigned int mode : 2; unsigned int code : 5; };
Dans cet exemple, la structure occupe au minimum 8 bits au lieu de 3 * sizeof(unsigned int).
Où les utiliser :
Limitations et pièges :
Exemple :
struct Packet { unsigned char start : 1; unsigned char id : 3; unsigned char flag : 4; };
Question : Peut-on utiliser le type char ou signed int pour les champs de bits ?
Réponse : La norme C autorise l'utilisation de int, unsigned int et (par extensions des compilateurs) d'autres types entiers standard (char, short). Cependant, la portabilité est garantie uniquement pour int et unsigned int.
Exemple d'erreur :
struct Example { signed char a : 3; }; // Sur différents compilateurs/architectures, différentes règles de stockage du signe et de l'ordre des bits.
Histoire
Lors de l'intégration de logiciels sur ARM et x86, il a été constaté que la structure avec champs de bits se décompressait différemment : ordre des bits et alignement variés. J'ai conçu sans tenir compte de ces différences, ce qui a conduit à l'impossibilité de lire les données dans un environnement multiplateforme.
Histoire
Dans le système de contrôle des moteurs, un type
chara été incorrectement utilisé dans les structures de champs de bits. Sur certains processeurs ARM, cela s'accompagnait d'une extension incorrecte du signe, ce qui entraînait une gestion erronée des drapeaux.
Histoire
Dans un protocole réseau, des champs de bits ont été utilisés pour emballer les drapeaux de message ; il n'a pas été pris en compte que les champs non initialisés supérieurs restent aléatoires. Des erreurs d'état aléatoires se produisaient lors de la transmission entre appareils en raison des différences d'initialisation.