Это битовые поля, например, unsigned int addr: 9;
создает поле addr
длиной 9 бит.
Обычно используется для упаковки большого количества значений в целочисленный тип. В вашем конкретном случае он определяет структуру 32-битной инструкции микрокода для (возможно) гипотетического ЦП (если вы сложите все длины битовых полей, они в сумме составят 32).
Объединение позволяет вам загрузить одно 32-битное значение, а затем получить доступ к отдельным полям с помощью кода вроде (исправлены мелкие проблемы, в частности, объявления кода
и теста
]):
#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
.
Это битовое поле . Число после двоеточия показывает, сколько бит занимает каждая переменная.
Это декларатор, который указывает количество бит для переменной.
Для получения дополнительной информации см .:
http://msdn.microsoft.com/en-us/library/yszfawxh (VS.80) .aspx