Que signifie deux points dans une déclaration de structure, tels que: 1,: 7,: 16 ou: 32?

StackOverflow https://stackoverflow.com/questions/1604968

  •  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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top