Во-первых, как отмечается в комментариях, определение типа "неопределенность" является неопределенным поведением в C ++.Так что вам следует читать только тот член профсоюза, которому вы в последний раз присвоили значениеВторая проблема заключается в том, что порядок заполнения битовых полей определяется реализацией (некоторые компиляторы могут размещать первый член в MSB базового типа, однако большинство предпочитает LSB).
Чтобы обойти любой изЭти проблемы, я бы выполнил ту работу, которую вы пытаетесь упростить с помощью битовых полей вручную:
class UniColor
{
uint32_t color; // defined in cstdint header; safer than unsigned long or int!
public:
UniColor(uint32_t color) : color(color) { }
UniColor(uint8_t red, uint8_t green, uint8_t blue)
: color
(
static_cast<uint32_t>(red) << 16
| static_cast<uint32_t>(green) << 8
| static_cast<uint32_t>(blue)
)
{ }
uint8_t red() // getter
{
return color >> 16;
}
void red(uint8_t value) // setter
{
color = color & 0x0000ffffU | static_cast<uint32_t>(red) << 16
}
uint8_t green()
{
return color >> 8 & 0xffU;
}
// rest analogously
};
Вы заметите, что я установил 32 бита как 0xuurrggbb
(u: не используется);если вы предпочитаете или нуждаетесь в другом порядке, отрегулируйте битовые сдвиги соответствующим образом в вышеуказанных функциях.Вы могли бы даже рассмотреть возможность использования пока неиспользованного байта для альфа-канала ...