Les champs de bits peuvent-ils être uniquement des champs d’une structure / union, jamais de variables «normales», «autonomes»?

La partie champ des champs de bits semble suggérer qu’ils ne peuvent être que des champs à l’intérieur d’une structure ou d’une union.

Un champ de bits peut-il être une variable “autonome” typique, en dehors de tout type de données agrégé tel qu’une union ou une structure, comme suit:

int sum:6; //Can this work as a declaration statement? sum=4; 

Sinon pourquoi? Si les champs de bits sont essentiellement destinés à utiliser moins de mémoire, pourquoi ne pouvons-nous pas déclarer une variable comme un champ de bits si nous soaps qu’elle ne dépassera pas cette taille?

Les champs de bits ne sont qu’une partie des structures ou des unions, car c’est ce que permet le standard C. Il aurait été possible de décider différemment. Pourquoi le comité a-t-il décidé de rédiger la norme telle quelle, il faudrait leur demander.

Pour trouver les informations dans la norme C99:

De la table des matières:

6.7 Déclarations

6.7.2 Spécificateurs de type (d’accord, celui-ci est un peu obscur)

6.7.2.1 Spécificateurs de structure et d’union.

Un champ de bits est la partie de la syntaxe declarator_opt : constant-expression . Cette syntaxe n’est autorisée que dans ce cas, ce qui a pour conséquence d’empêcher de déclarer des champs de bits ailleurs.

La syntaxe vous indique que le nom d’un champ de bits peut éventuellement être omis si vous êtes curieux de recevoir ce type d’informations. La clause 6.7.2.1:3 va plus loin et interdit les noms de champs de bits de longueur nulle.

Les champs de bits ne peuvent être définis que dans les structures et les unions où ils peuvent être référencés individuellement par leur nom. Vous ne pouvez pas adresser la mémoire par bits, une taille minimale en octets est requirejse (8 bits). Afin de traiter une variable bit par bit, vous pouvez utiliser un masque comme suit:

 int num = 9; int fourthBit = (num >> 4) & 1; 

Une structure peut avoir une taille plus grande, par exemple un int (de 4 octets), puis être divisée en bits en différentes parties. Bien sûr, la mission sera compilée à l’aide de masques.

Reportez-vous à cela pour plus d’informations: http://msdn.microsoft.com/en-us/library/yszfawxh(v=vs.80).aspx

Sinon pourquoi? Si les champs de bits sont essentiellement destinés à utiliser moins de mémoire, pourquoi ne pouvons-nous> déclarer aucune variable en tant que champ de bits si nous soaps qu’elle ne dépassera pas cette taille?

Parce que la mémoire est fixée à 16 ou 32 bits de large. Il serait trop lent d’emballer un utilisateur de 14 bits en 16 bits et d’utiliser les 2 autres bits. Il vaut mieux gaspiller les 2 bits et ne pas vous laisser définir dans un stockage efficace. C’est pourquoi, si vous le souhaitez vraiment, vous pouvez utiliser un syndicat. Vous ne gagneriez rien en faisant travailler le compilateur plus fort pour rien. Les personnes qui ont écrit le compilateur étaient intelligentes. Ils ne laissent pas juste un programmeur avec une mauvaise idée ralentir les choses, désolé /.