Я просто играл с битовыми полями и наткнулся на то, что не могу понять, как обойти.
(Примечание о платформе: размер int = 2 байта, long = 4 байта, long long = 8 байтов - думаю, стоит упомянуть, поскольку я знаю, что он может варьироваться. Также тип «байт» определяется как «беззнаковый символ»)
Я хотел бы иметь возможность сделать массив из двух 36-битных переменных и поместить их в объединение с массивом из 9 байтов. Вот что я придумал:
typedef union {
byte bytes[9];
struct {
unsigned long long data:36;
} integers[2];
} Colour;
Я работал над теорией, согласно которой компилятор поймет, что в анонимной структуре должно быть два битовых поля, и поместит их вместе в пространство размером 9 байт. Однако оказывается, что они выравниваются по границе байта, поэтому объединение занимает 10 байтов, а не 9, что вполне логично.
Вопрос в том, есть ли способ создать такой массив из двух битовых полей? Я рассматривал атрибут "packed", но компилятор его просто игнорирует.
Хотя это работает, как и ожидалось (sizeof() возвращает 9):
typedef union {
byte bytes[9];
struct {
unsigned long long data0:36;
unsigned long long data1:36;
} integers;
} Colour;
Было бы предпочтительнее, чтобы он был доступен в виде массива.
Редактировать: спасибо cdhowie за его объяснение, почему это не сработает.
К счастью, я придумал способ добиться того, чего хочу:
typedef union {
byte bytes[9];
struct {
unsigned long long data0:36;
unsigned long long data1:36;
unsigned long long data(byte which){
return (which?data1:data0);
}
void data(byte which, unsigned long long _data){
if(which){
data1 = _data;
} else {
data0 = _data;
}
}
} integers;
} Colour;