Detecting endianness programmatically in a C++ program

algorithm, c++, endianness

Solution

I don't like the method based on type punning - it will often be warned against by compiler. That's exactly what unions are for!

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

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

The principle is equivalent to the type case as suggested by others, but this is clearer - and according to C99, is guaranteed to be correct. GCC prefers this compared to the direct pointer cast.

This is also much better than fixing the endianness at compile time - for OSes which support multi-architecture (fat binary on Mac OS X for example), this will work for both ppc/i386, whereas it is very easy to mess things up otherwise.

Problem

Is there a programmatic way to detect whether or not you are on a big-endian or little-endian architecture? I need to be able to write code that will execute on an Intel or PPC system and use exactly the same code (i.e., no conditional compilation).

Original source

Related problems