педантичный ответ:
Ваш код имеет неопределенное поведение.Запись в поле объединения и чтение из другого не гарантируется, поэтому любое несоответствие, которое вы видите, может быть удалено вручную как "неработающий код".
В действительности , так много людей вдикие полагаются на то, что это «нарушенное поведение» является непротиворечивым, что все современные компиляторы все еще обеспечивают предсказуемую функциональность здесь (за счет игнорирования некоторых возможностей оптимизации).Так что в вашем коде действительно есть что-то конкретное, что заставляет его вести себя так, как он делает:
В Example1_t
объединение имеет два перекрывающихся поля: all_bits
и структура.Внутри этой структуры каждый член имеет отдельное хранилище.
В Example2_t
, a
, b
, c
, d
и e
являются отдельными полями объединения, поэтому ониу всех есть перекрывающееся хранилище.