Согласно стандарту, результат записи одному члену союза, а затем чтению другого не определен. Может случиться что угодно.
Реально, если вы запустите код на машине с прямым порядком байтов, a [0], вероятно, будет 0, а [1], вероятно, будет 2. На 16-битной машине с прямым порядком байтов a [0] будет 2, а [1] будет 0. На 32-битной машине с прямым порядком байтов (несуществующей, как вы уже определили вещи) a [2] будет 2, а [0], a [1 ], & a [3] будет 0.