> 「そもそもunionを使わなければならない理由は何でしょうか?」

私の場合は、例えばdoubleとunsigned char[8]とで
unionを作っておくことで、ファイル保存する時のバイト順を
簡単に入れ替えることができるため、
unionを使う習慣があります。
例えばファイル保存データをビッグエンディアンと決めておいて、
ファイル保存ルーチンのほうで、プラットフォーム毎の処理を記述するわけです。
あるプラットフォームでは、char[0]から順番に書き込む処理になっていて、
別のプラットフォームでは逆順だったり...
だから、私の場合unionの一方は必ずunsigned charの配列です。