Эта конструкция определяет длину в битах для каждого поля.
Преимущество этого заключается в том, что вы можете контролировать sizeof (op)
, если будете осторожны. размер структуры будет суммой размеров полей внутри.
В вашем случае размер операции составляет 32 бита (то есть sizeof (op)
равен 4).
Размер всегда округляется до следующего кратного 8 для каждой группы беззнаковых xxx: yy; построить.
Это означает:
struct A
{
unsigned a: 4; // 4 bits
unsigned b: 4; // +4 bits, same group, (4+4 is rounded to 8 bits)
unsigned char c; // +8 bits
};
// sizeof(A) = 2 (16 bits)
struct B
{
unsigned a: 4; // 4 bits
unsigned b: 1; // +1 bit, same group, (4+1 is rounded to 8 bits)
unsigned char c; // +8 bits
unsigned d: 7; // + 7 bits
};
// sizeof(B) = 3 (4+1 rounded to 8 + 8 + 7 = 23, rounded to 24)
Я не уверен, что правильно это помню, но думаю, что правильно понял.
Модификатор двоеточия в целочисленных типах указывает, сколько битов должно занимать int.
Здесь объявляется битовое поле; число после двоеточия дает длину поля в битах (т.е. сколько бит используется для его представления).
unsigned op_type:9;
Означает, что op_type является целочисленной переменной с 9 битами.