Да, может. Почему нет? Битовые поля в объединениях ведут себя так же, как и везде. Нет ничего особенного в битовых полях в объединениях (или объединениях с битовыми полями).
Да, это возможно, но я бы не рекомендовал этого. Длина и упаковка битовых полей непереносимы. Размер объединения будет трудно предсказать (см. здесь ). При использовании объединений или битовых полей вы вносите в код определенную сложность. Хотя эта сложность может быть приемлемой в вашем коде, их объединение может привести к неприемлемой сложности. Если вы используете объединения, структуры и битовые поля, вы столкнетесь с проблемами с выравниванием памяти.
Если это одноразовый код, который нужно создать и запустить только на одной машине, то, вероятно, это нормально. Однако, если вы проверяете это в системе контроля версий, где оно будет жить вечно, я не рекомендую этого делать.
Если вы приведете пример того, почему вы хотите это сделать, я или кто-то другой могу предложить лучшую альтернативу.
РЕДАКТИРОВАТЬ: поясняется на основе комментариев и для запроса обратной связи.
Это небезопасно, только если вы пишете в один элемент объединения и читаете из другого. Если детали вашей реализации гарантируют, что этого не произойдет, тогда объединение, содержащее bitfied (и, предположительно, другие члены), имеет четко определенное безопасное поведение.
Если вы подумаете о том, как работает объединение, у вас есть ответ - да, конечно (почему бы и нет)? Как мы и ожидали, объединение достаточно велико, чтобы вместить самое большое данное, и поэтому автоматически меньшее. Битовые поля упаковываются в "контейнеры", и компилятор должен иметь возможность оценить их конечный реальный размер. Ниже показаны некоторые интересные факты (и, конечно, это неправильное использование объединения, но не для присутствия битового поля!)
#include <stdio.h>
union test {
int a:5;
int b:12;
float c;
double d;
int x;
};
int main()
{
union test x;
printf("%d\n", sizeof(x));
x.a = 31;
printf("%d\n", x.a);
printf("%d\n", x.b);
x.c = 1.23;
printf("%d\n", x.a);
printf("%f\n", x.c);
x.x = 31;
printf("%d\n", x.x);
printf("%d\n", x.a);
printf("%d\n", x.b);
}