Que signifie deux points dans une déclaration de structure, tels que: 1,: 7,: 16 ou: 32?
-
05-07-2019 - |
Question
Que signifie le code C ++ suivant?
unsigned char a : 1;
unsigned char b : 7;
Je suppose que cela crée deux caractères a et b, et que les deux doivent avoir un octet de long, mais je n'ai aucune idée de ce que le "" ;: 1" et " ;: 7 " une partie fait.
La solution
Le 1 et le 7 sont des tailles de bits pour limiter la plage des valeurs. Ils se trouvent généralement dans les structures et les syndicats. Par exemple, sur certains systèmes (dépend de la largeur et des règles d'emballage de char
, etc.), le code:
typedef struct {
unsigned char a : 1;
unsigned char b : 7;
} tOneAndSevenBits;
crée une valeur de 8 bits, un bit pour a
et 7 bits pour b
.
Généralement utilisé en C pour accéder à " compressé " des valeurs telles qu'un nybble 4 bits pouvant figurer dans la partie supérieure d'un caractère 8 bits:
typedef struct {
unsigned char leftFour : 4;
unsigned char rightFour : 4;
} tTwoNybbles;
Pour les juristes spécialistes des langues parmi nous, la section 9.6 de la norme C ++ 11 explique ceci en détail, légèrement paraphrasé:
Champs de bits [class.bit]
Un membre-déclarateur de la forme
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; identifiant opt & nbsp; & nbsp; & nbsp; attribut-spécificateur opt & nbsp; & nbsp; & nbsp;: & nbsp; & nbsp; & nbsp; expression constante
spécifie un champ de bits; sa longueur est différenciée du nom du champ de bits par deux points. Le attribut-spécificateur facultatif appartient à l'entité en cours de déclaration. L'attribut bit-field ne fait pas partie du type du membre de la classe.
L'expression constante-expression doit être une expression constante intégrale avec une valeur supérieure ou égale à zéro. La valeur de l'expression de constante intégrale peut être supérieure au nombre de bits dans la représentation d'objet du type de champ de bits; dans ce cas, les bits supplémentaires sont utilisés comme bits de remplissage et ne participent pas à la représentation de la valeur du champ de bits.
L'affectation de champs de bits dans un objet de classe est définie par l'implémentation. L'alignement des champs de bits est défini par l'implémentation. Les champs de bits sont regroupés dans une unité d’allocation adressable.
Remarque: Des champs de bits enjambent des unités d'allocation sur certaines machines et pas sur d'autres. Les champs de bits sont affectés de droite à gauche sur certaines machines et de gauche à droite sur d'autres. - note de fin
Autres conseils
Je crois que ce sont des champs de bits.
À proprement parler, un champ de bits doit être un int, un unsigned int ou un _Bool. Bien que la plupart des compilateurs prennent n'importe quel type intégral.
Réf C11 6.7.2.1:
Un champ de bits doit avoir un type qualifié ou non qualifié. version de _Bool, signé int, non signé, ou autre type défini par l'implémentation.
Votre compilateur allouera probablement 1 octet de stockage, mais il est libre d'en récupérer davantage.
Réf C11 6.7.2.1:
Une implémentation peut allouer toute unité de stockage adressable de grande taille assez pour tenir un champ de bits.
Les économies surviennent lorsque plusieurs champs de bits sont déclarés les uns après les autres. Dans ce cas, le stockage alloué sera compressé si possible.
Réf C11 6.7.2.1:
S'il reste suffisamment d'espace, un champ de bits qui suit immédiatement un autre champ de bits dans une structure doit être emballé en bits adjacents de la même unité. S'il ne reste pas assez d'espace, si un champ de bits qui ne correspond pas est mis dans l'unité suivante ou chevauche les unités adjacentes est défini par la mise en œuvre.