2010-07-22 3 views
22

Возможные Дубликаты:
What does ‘: number’ after a struct field mean?
What does ‘unsigned temp:3’ meansИспользование: оператора в C

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

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

#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/

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

Спасибо!

+0

Обратите внимание, что расположение битовых полей определяется реализацией, поэтому результат доступа битовых полей в междунар через объединение не определено. Не делайте этого в производственном коде, используйте бит-маски и вместо этого переходите. – starblue

ответ

38

Это бит-поля, например, 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.

7

Это bit field. Число после двоеточия - это количество бит каждой переменной.

Смежные вопросы