A union
не является struct
. В union
все данные занимают одно и то же пространство и могут обрабатываться как разные типы через имена полей. Когда вы присваиваете true
для x.b
, вы перезаписываете младшие биты 20000
.
Более конкретно:
20000 в двоичном виде: 100111000100000
19969 в двоичном виде: 100111000000001
Здесь произошло то, что вы поместили однобайтовое значение 1 (00000001) в 8 младших битов 200000.
Если вы используете struct
вместо union
, у вас будет место для int
и bool
, а не просто int
, и вы увидите ожидаемые результаты.