Прежде всего, в этом коде отсутствуют ссылки. Символ &
, когда используется как унарный оператор (а не как часть имени типа), как в этом контексте, означает «адрес-из». Таким образом, &i
является "адресом i
", не"ссылкой на i
".
Я не уверен, откуда вы взяли, что использование значения 9 в качестве структуры bf
должно заставить y
получить значение 9
. Когда вы пишете это:
bf* bitfields=(bf *)&i;
В результате вы говорите компилятору «обрабатывать значение в ячейке памяти &i
, как если бы оно было bf
структурой». Структура bf
определена таким образом, что, начиная с младших значащих (самых правых) битов, первые четыре бита являются значением x
, вторые четыре бита являются значением y
, третьи четыре бита являются значением z
значение и т. Д.
Так как значение в местоположении &i
равно 8
, а 8 в 16-битном двоичном виде равно
0000 0000 0000 1000
Поля bitfields
будут:
0000 0000 0000 1000
w z y x
Таким образом, значение x
(4-разрядное целое число без знака) равно 8, а значения y
, z
и w
равны 0.
В случае, если вы пишете
bf*bit=(bf*)&j;
вы делаете то же самое, что и выше, за исключением того, что теперь значение равно 9, поэтому назначения:
0000 0000 0000 1001
w z y x
Итак, x
имеет значение 9, а остальные значения по-прежнему равны 0.
Если вы хотите присвоить значение 9 для y
вместо x
, назначения должны выглядеть следующим образом:
0000 0000 1001 0000
w z y x
Таким образом, вам нужно использовать значение с 16-битным двоичным представлением
0000 0000 1001 0000
То есть 144. Так что если вы позволите j = 144
вместо j = 9
, вы заметите, что bit->y
равно 9, а все остальные поля в bit
равны 0.