Before you can read a single line of the parent note, you must own every word and symbol it throws at you. Below, each item is built from the one before it. Nothing is used before it is drawn.
Look at the figure: eight tiny switches (bits) sit inside one box. Each switch is OFF (0) or ON (1). Eight switches give 28=256 patterns, so one byte holds 0 to 255.
Why the topic needs it: a union is described entirely in terms of how many bytes each member takes and which bytes overlap. If "byte" is fuzzy, everything after is fuzzy.
In the figure the red box is at offset 0 — the very first box of the object. The parent note keeps saying "all members start at the same address (offset 0)". This picture is that sentence.
four bytes as a decimal, using a special bit layout
double
8
eight bytes as a more precise decimal
Why the topic needs it: the parent's key warning — reading a different member reinterprets the raw bits, it does not convert — is exactly "same boxes, different ruler."
Reading the notation:sizeof(union Mix) == 8 means "measuring the union gives 8 boxes." The == here is C's is-it-equal? test, giving true/false — not assignment.
The figure stacks each member's bytes from offset 0. The red bar is the largest member — its length sets the room size, because the room must survive the worst case (the biggest tenant).
Why max and not ∑ (sum)? A struct adds member sizes because members sit in separate boxes (sum). A union overlaps them on the same boxes, so only the longest one matters (max). That single choice — sum vs max — is the whole difference. See Structs — separate memory for each member.
Why the topic needs it: the parent writes "(plus padding for alignment)" and never explains it. Now you know: padding is the rounding-up so arrays of unions keep every element on a legal address. Full story in Memory alignment and padding.
The number 65 in one int is, in hex, 00 00 00 41 (only the last byte carries value). The figure shows little-endian laying it down as 41 00 00 00 — the red 41 landing in box 0. So reading box 0 as a char gives 0x41 = 'A'. That is exactly the parent's u.c[0] == 'A' example. Deeper: Endianness — byte order.
Why the topic needs it: the parent's type-punning example only makes sense once you know why the 'A' shows up at c[0] and not c[3].