csyntax

Use of the : operator in C


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.


Solution

  • 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.