I was reading [this question here about deciding endianness](https://stackoverflow.com/questions/1001307/detecting-endianness-programmatically-in-a-c-program) and the first answer baffled me somewhat.

The code used to decide big endianness is as follows: 

```
int is_big_endian(void)
{
    union {
        uint32_t i;
        char c[4];
    } bint = {0x01020304};

    return bint.c[0] == 1; 
} 

```

My question is *how does the compiler here decide what type to use for that array* of hex digits? Because technically it fits equally well in both that `uint32_t` or that `char[4]`.

Why not just store it in the `char[4]` and skip the `union`? 

Is there some advantage of a `union` here that I don't see? I know this is called type-punning, but I fail to see its advantage here.