34

Possible Duplicates:
What does ‘: number’ after a struct field mean?
What does ‘unsigned temp:3’ means

I hate to ask this type of question, but it's really bugging me, so I will ask:

What is the function of the : operator in the code below?

#include <stdio.h>

struct microFields
{
  unsigned int addr:9;
  unsigned int cond:2;
  unsigned int wr:1;
  unsigned int rd:1;
  unsigned int mar:1;
  unsigned int alu:3;
  unsigned int b:5;
  unsigned int a:5;
  unsigned int c:5;
};

union micro
{
  unsigned int microCode;
  microFields code;
};

int main(int argc, char* argv[])
{
  micro test;
  return 0;
} 

If anyone cares at all, I pulled this code from the link below: http://www.cplusplus.com/forum/beginner/15843/

I would really like to know because I know I have seen this before somewhere, and I want to understand it for when I see it again.

ROMANIA_engineer
  • 51,252
  • 26
  • 196
  • 186
Russel
  • 3,519
  • 7
  • 31
  • 32
  • Note that the layout of bit fields is implementation defined, so the result of accessing bit fields in an int through a union is undefined. Don't do this in production code, use bit masks and shifting instead. – starblue Jul 22 '10 at 05:50

3 Answers3

55

They're bit-fields, an example being that unsigned int addr:9; creates an addr field 9 bits long.

It's commonly used to pack lots of values into an integral type. In your particular case, it defining the structure of a 32-bit microcode instruction for a (possibly) hypothetical CPU (if you add up all the bit-field lengths, they sum to 32).

The union allows you to load in a single 32-bit value and then access the individual fields with code like (minor problems fixed as well, specifically the declarations of code and test):

#include <stdio.h>

struct microFields {
    unsigned int addr:9;
    unsigned int cond:2;
    unsigned int wr:1;
    unsigned int rd:1;
    unsigned int mar:1;
    unsigned int alu:3;
    unsigned int b:5;
    unsigned int a:5;
    unsigned int c:5;
};

union micro {
    unsigned int microCode;
    struct microFields code;
};

int main (void) {
    int myAlu;
    union micro test;
    test.microCode = 0x0001c000;
    myAlu = test.code.alu;
    printf("%d\n",myAlu);
    return 0;
}

This prints out 7, which is the three bits making up the alu bit-field.

paxdiablo
  • 814,905
  • 225
  • 1,535
  • 1,899
8

It's a bit field. The number after the colon is how many bits each variable takes up.

dan04
  • 82,709
  • 22
  • 159
  • 189
1

That's a declarator that specifies the number of bits for the variable.

For more information see:

http://msdn.microsoft.com/en-us/library/yszfawxh(VS.80).aspx

tgiphil
  • 1,212
  • 10
  • 21