Search code examples
carchitecturemacrosc-preprocessorendianness

Macro definition to determine big endian or little endian machine?


Is there a one line macro definition to determine the endianness of the machine? I am using the following code but converting it to macro would be too long:

unsigned char test_endian( void )
{
    int test_var = 1;
    unsigned char *test_endian = (unsigned char*)&test_var;

    return (test_endian[0] == 0);
}

Solution

  • Code supporting arbitrary byte orders, ready to be put into a file called order32.h:

    #ifndef ORDER32_H
    #define ORDER32_H
    
    #include <limits.h>
    #include <stdint.h>
    
    #if CHAR_BIT != 8
    #error "unsupported char size"
    #endif
    
    enum
    {
        O32_LITTLE_ENDIAN = 0x03020100ul,
        O32_BIG_ENDIAN = 0x00010203ul,
        O32_PDP_ENDIAN = 0x01000302ul,      /* DEC PDP-11 (aka ENDIAN_LITTLE_WORD) */
        O32_HONEYWELL_ENDIAN = 0x02030001ul /* Honeywell 316 (aka ENDIAN_BIG_WORD) */
    };
    
    static const union { unsigned char bytes[4]; uint32_t value; } o32_host_order =
        { { 0, 1, 2, 3 } };
    
    #define O32_HOST_ORDER (o32_host_order.value)
    
    #endif
    

    You would check for little endian systems via

    O32_HOST_ORDER == O32_LITTLE_ENDIAN