Developpez.com - C
X

Choisissez d'abord la catégorieensuite la rubrique :

next up previous contents index
Next: Les énumérations Up: Structures, unions et énumérations Previous: Exercice

Sous-sections

Les champs de bits

   
Généralités

  Il est parfois nécessaire pour un programmeur de décrire en termes de bits la structure d'une ressource matérielle de la machine. Un exemple typique est la programmation système qui nécessite de manipuler des registres particuliers de la machine. Par exemple, dans le manuel du MC 68030 de Motorola, le registre d'état est ainsi décrit :
-
bit 0 : carry ;
-
bit 1 : overflow ;
-
bit 2 : zéro ;
-
bit 3 : négatif ;
-
bit 4 : extension ;
-
bits 5-7 : inutilisés ;
-
bits 8-10 : masque des interruptions ;
-
bit 11 : inutilisé ;
-
bits 12-13 : niveau de privilège ;
-
bits 14-15 : état des traces.

Il existe dans le langage C un moyen de réaliser de telles descriptions, à l'aide du concept de structure. En effet, dans une déclaration de structure, il est possible de faire suivre la définition d'un membre par une indication du nombre de bits que doit avoir ce membre. Dans ce cas, le langage C appelle ça un champ de bits.

Le registre d'état du MC 68030 peut se décrire ainsi :

struct sr
   {
   unsigned int trace : 2;
   unsigned int priv : 2;
   unsigned int : 1;            /*   inutilisé   */
   unsigned int masque : 3;
   unsigned int : 3;            /*   inutilisé   */
   unsigned int extend : 1;
   unsigned int negative : 1;
   unsigned int zero : 1;
   unsigned int overflow : 1;
   unsigned int carry : 1;
   };
On voit que le langage C accepte que l'on ne donne pas de nom aux champs de bits qui ne sont pas utilisés.

Contraintes

     
1.
Les seuls types acceptés pour les champs de bits sont int, unsigned int et signed int.
2.
L'ordre dans lequel sont mis les champs de bits à l'intérieur d'un mot dépend de l'implémentation, mais généralement, dans une machine little endian les premiers champs décrivent les bits de poids faibles et les derniers champs les bits de poids forts, alors que c'est généralement l'inverse dans une machine big endian.
3.
Un champ de bit déclaré comme étant de type int, peut en fait se comporter comme un signed int ou comme un unsigned int (cela dépend de l'implémentation). Il est donc recommandé d'une manière générale de déclarer les champs de bits comme étant de type unsigned int.
4.
Un champ de bits n'a pas d'adresse, on ne peut donc pas lui appliquer l'opérateur adresse de (&).
 


next up previous contents index
Next: Les énumérations Up: Structures, unions et énumérations Previous: Exercice
Bernard Cassagne
1998-12-09
Contacter le responsable de la rubrique C