INFO: Initializing Bitfields as Integers in C

This article was previously published under Q60252
This article has been archived. It is offered "as is" and will no longer be updated.
In Microsoft C, you can initialize the values of an entire bitfieldstructure as an integer in several ways:
  • Declare the bitfield structure as part of a union with an integer. (This is the preferred method).
  • Use an integer pointer by setting the pointer to the address of the structure and then changing what the pointer points to.
  • Enforce the bitfield type constraints to get a copy of the bitfield into an integer variable.
For examples of these three methods, see below.
In Microsoft C, bitfields are stored in word-sized blocks with the leastsignificant bit representing the first bit of the bitfield. For example,the bitfields in bitstruct, defined below in the example, are stored asfollows:
           <  p4   > <  p3   > < p2> <p1>        |?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|				
Assigning the integer 0x4c to this structure results in the following bitpattern:
The bitfields are given the following respective values:
   p1=0 p2=3 p3=2 p4=0				
If the number of bits needed for a bitfield structure exceeds 16 in codecompiled for MS-DOS or Windows, words will be added as needed to provideroom for the structure with no single bitfield crossing a word boundary.Microsoft C/C++, 32-bit Edition, stores bitfield structures in double wordvalues. If the field requires more than 32 bits, the compiler usesadditional double words as needed.

NOTE: There is no "standard" for storing bitfields in memory; therefore,any program that depends on a particular storage method is not portable tosystems that use a different method.

Sample Code

struct strtype   {   unsigned p1:2;   unsigned p2:3;   unsigned p3:5;   unsigned p4:5;   } bitstruct;union untype   {   struct strtype un_bitstruct;   unsigned bit_integer;   } bitunion;unsigned *intptr;unsigned intgr;void main(void){   /*  Using the bitfield structure only */       /* Set the pointer to address of bitfield */    intptr = (unsigned *)&bitstruct;      /* Change the bitfield */    *intptr = 0x4c;      /* Get the new value */    intgr = *(unsigned *)&bitstruct;   /* Using an union makes this much easier (syntactically) */       /* Set the pointer */    intptr = &bitunion.bit_integer;      /* Change the bitfield */    bitunion.bit_integer = 0x4c;      /* Get the new value */    intgr = bitunion.bit_integer;}				
8.00 8.00c 9.00

Article ID: 60252 - Last Review: 02/27/2014 18:29:57 - Revision: 2.1

  • Microsoft C Professional Development System 6.0a
  • Microsoft Visual C++ 1.0 Professional Edition
  • Microsoft Visual C++ 1.5 Professional Edition
  • Microsoft Visual C++ 2.0 Professional Edition
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • kbnosurvey kbarchive kbinfo kblangc kbcode KB60252