36

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.

dbc
  • 104,963
  • 20
  • 228
  • 340
Russel
  • 3,609
  • 8
  • 33
  • 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

58

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
  • 854,327
  • 234
  • 1,573
  • 1,953
8

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

dan04
  • 87,747
  • 23
  • 163
  • 198
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,242
  • 10
  • 22