...
An object shall have its stored value accessed only by an lvalue expression that has one of
the following types:
- a type compatible with the effective type of the object,
- a qualified version of a type compatible with the effective type of the object,
- a type that is the signed or unsigned type corresponding to the effective type of the
object,- a type that is the signed or unsigned type corresponding to a qualified version of the
effective type of the object,- an aggregate or union type that includes one of the aforementioned types among its
members (including, recursively, a member of a subaggregate or contained union), or- a character type.
Accessing an object by means of any other lvalue expression results in undefined behavior . See bullet 34 of Appendix J.
...