Если вы записываете столбец возможных шаблонов бит для каждой ширины этих подписанных переменных, с десятичным эквивалентом рядом с ними, вы скоро увидите, почему вы получаете эти результаты. Предполагая повторное представление дополнения 2, однобитовая подписанная переменная имеет два возможных значения: -1 и 0. 2-битная подписанная переменная сохраняет значения в диапазоне от -2 до 1 и так далее.
Bin Dec Bin Dec Bin Dec
011 3 01 1 0 0
010 2 00 0 1 -1
001 1 11 -1
000 0 10 -2
111 -1
110 -2
101 -3
100 -4
В вашем случае s.i = 1;
int
значение 1 в двоичной 1, и, как вы можете видеть, для переменной 1-битовым, это имеет значение -1.
В вашем случае s.j = 2;
значение int
значение 2 является двоичным 10, и, как вы можете видеть для 2-битной переменной, это значение -2.
В вашем случае s.k = 5;
значение int
значение 5 является бинарным 101, и, как вы можете видеть для 3-битовой переменной, это значение -3.
Однако это просто объяснение того, что может произойти , потому что это поведение, определяемое реализацией, для назначения значения, которое находится за пределами представляемого диапазона знакового целого.
Я оставлю вас, чтобы выработать 4-битный для себя. С s.l = 10;
это значение также выходит за пределы диапазона 4-разрядной подписанной переменной, которая составляет от -8 до 7.
Прочитайте свою книгу или Google или найдите этот сайт, чтобы узнать, что такое бит-поле. И ваши результаты отличаются от примера, потому что большая часть поведения битполей не стандартизирована. Поэтому рекомендуется избегать бит-полей, если вы хотите, чтобы ваш код работал на разных или будущих компиляторах. –
* «Вывод на сайте» * - Какой сайт? – StoryTeller
'int i: 1' делает нулевой смысл. Поле бит signed-int резервирует бит для знака, и поскольку вы предоставили только один бит, вы остаетесь с битовым полем с подписанным int, которое может быть отрицательным или положительным, но не имеет допустимого значения величины (есть никакие биты не оставлены для значения). Остальная часть этого кода, по-видимому, делает попытку нарушить максимальное значение, которое может быть предоставлено в предоставленных битах (за вычетом знакового бита). – WhozCraig