Macro definition to determine big endian or little endian machine?

architecture, c, c-preprocessor, endianness, macros

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

Problem

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); } ```

Original source

Related problems