Здесь есть пара проблем, во-первых, ваш битрейн Brane использует unsigned int, который составляет 4 байта.
Даже если вы просто используете половину битов, вы все равно используете целую 32-битную ширину unsigned int.
Во-вторых, ваши битовые поля Cmp используют два разных типа полей, поэтому вы используете 8-битный из 32-битного unsigned int для ваших первых 3 полей, а затем вы используете беззнаковый символ для его полного 8-битного.
Из-за правил выравнивания данных эта структура должна быть не менее 6 байтов, но потенциально больше.
Если вы хотите оптимизировать размер вашего союза, то получите только 16-битный. Сначала вам нужно использовать unsigned short
, а затем вам всегда нужно использовать один и тот же тип поля, чтобы все оставалось в одном и том же месте.
Примерно так будет полностью оптимизирован ваш союз:
union instructionSet {
struct Brane{
unsigned short opcode: 4;
unsigned short address: 12;
} brane;
struct Cmp{
unsigned short opcode: 4;
unsigned short blank: 1;
unsigned short rsvd: 3;
unsigned short letter: 8;
} cmp;
struct {
unsigned short rsvd: 16;
} reserved;
};
Это даст вам размер 2 вокруг.