Подтвердить что ты не робот

Использование оператора: в C

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

Я не хочу задавать этот тип вопросов, но это действительно беспокоит меня, поэтому я спрошу:

Какова функция оператора: в приведенном ниже коде?

#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;
} 

Если кому-то все равно, я вытащил этот код по ссылке ниже: http://www.cplusplus.com/forum/beginner/15843/

Мне бы очень хотелось знать, потому что я знаю, что видел это где-то раньше, и я хочу понять это, когда увижу это снова.

4b9b3361

Ответ 1

Они - бит-поля, примером является то, что unsigned int addr:9; создает поле addr длиной 9 бит.

Он обычно используется для упаковки большого количества значений в интегральный тип. В вашем конкретном случае он определяет структуру 32-разрядной команды микрокода для (возможно) гипотетического процессора (если вы суммируете все длины битового поля, они суммируются до 32).

Объединение позволяет загружать в одно 32-битное значение, а затем обращаться к отдельным полям с таким кодом (как мелкие проблемы, а также объявления code и 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;
}

Это выдает 7, это три бита, составляющие бит-поле alu.