Well, it's not terribly complicated. What it all boils down to is this: Any primitive object (i.e. scalar, floating point or pointer) needs to reside at an address which is a multiple of the size of said object. The C compiler will normally take care of this for you, but by performing pointer arithmetic on type-punned pointers it is possible to shoot oneself in the foot.