2009-06-17 7 views
4

J'ai toujours pensé que je savais C très bien jusqu'à ce que j'ai vu quelque chose comme ça dans un autre poste:Question sur un C construire

struct foo { 
    int x:1; 
}; 

Je voudrais vraiment connaître le but de: 1. Quelqu'un peut-il m'indiquer? Merci.

Répondre

11

bitfield. x est 1 bit de long.

Chaque champ est consulté et manipulé comme si elle était un membre ordinaire d'une structure . Les mots-clés signés et signés signifient ce que vous attendez, sauf qu'il est intéressant de noter qu'un champ 1-bit signé sur une machine à complément d'un deux ne peut prendre que les valeurs 0 ou -1. Les déclarations sont autorisées à inclure les qualificateurs volatils const et .

L'utilisation principale de bitfields est soit à permettent fardelage des données ou pour être en mesure de préciser les champs dans certains fichiers de données produits à l'extérieur. C ne donne aucune garantie quant à la commande des champs dans les mots machine, donc si vous les utilisez pour cette dernière raison, le programme ne sera pas seulement non portable, il sera également dépendant du compilateur. La norme dit que les champs sont emballés en «unités de stockage», qui sont généralement mots machine. L'emballage ordre, et si oui ou non un champ de bit peut traverser une limite d'unité de stockage, sont mise en œuvre définie. Pour forcer alignement à une limite d'unité de stockage, un champ de largeur zéro est utilisé avant le celui que vous souhaitez avoir aligné.

Faites attention à les utiliser. Il peut exiger une quantité surprenante de code d'exécution pour manipuler ces choses et vous pouvez utiliser en utilisant plus d'espace que enregistrer.

Les champs de bits n'ont pas d'adresse. Vous ne pouvez pas y ajouter de pointeurs ou les tableaux d'entre eux.

http://publications.gbdirect.co.uk/c_book/chapter6/bitfields.html

+0

Merci! Mais quel avantage cela a-t-il en déclarant simplement un entier régulier? –

+0

@Joe M: Il utilise potentiellement moins d'espace. C'est plus utile lorsque vous avez plusieurs champs de bits, puisque le compilateur utilisera (espérons-le) moins de mémoire par structure dans ce cas que plusieurs entiers. –

+1

Vous pouvez accéder aux champs individuellement au lieu d'écrire des éléments de manipulation de bits chaque fois que vous souhaitez y accéder. – Joey

0

Cette syntaxe est utilisée pour désigner les champs de bits (ie champs de bits qui sont plus étroites que le type de données lui-même), de sorte que le « x » dans votre exemple est vraiment utilisé 1 bit d'un int .

Un exemple plus utile peut-être quelque chose comme

char x:4; 
char y:4; 

Ce emballerait deux champs de 4 bits dans un octet. L'avantage est, bien sûr, de gagner de la place dans les architectures où chaque octet est critique.

1

C'est un champ de 1 bit. Il y a une bonne discussion sur le wikipedia.

3

ce sont des champs de bits.en struct, vous pouvez définir le nombre de bits sont affectés à la variable (remplaçant la norme pour le type de variable)

dans l'exemple ci-dessus x utilise seulement 1 octet et peut donc prendre que la valeur 0 ou 1.

voir l'exemple suivant de the C book. suivez le lien pour plus d'informations.

struct { 
     /* field 4 bits wide */ 
     unsigned field1 :4; 
     /* 
     * unnamed 3 bit field 
     * unnamed fields allow for padding 
     */ 
     unsigned  :3; 
     /* 
     * one-bit field 
     * can only be 0 or -1 in two's complement! 
     */ 
     signed field2 :1; 
     /* align next field on a storage unit */ 
     unsigned  :0; 
     unsigned field3 :6; 
}full_of_fields;