I only use unions when working in the kernel or when I'm building a driver, and that's just because the os uses them when working with LARGE_INTEGERS and other such data types. You can divide the LARGE_INTEGER (int64) in two parts (Low and High) without wasting memory using unions.