Ответ 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
.