C Macro definition to determine big endian or little endian machine? C Macro definition to determine big endian or little endian machine? c c

C Macro definition to determine big endian or little endian machine?


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"#endifenum{    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


If you have a compiler that supports C99 compound literals:

#define IS_BIG_ENDIAN (!*(unsigned char *)&(uint16_t){1})

or:

#define IS_BIG_ENDIAN (!(union { uint16_t u16; unsigned char c; }){ .u16 = 1 }.c)

In general though, you should try to write code that does not depend on the endianness of the host platform.


Example of host-endianness-independent implementation of ntohl():

uint32_t ntohl(uint32_t n){    unsigned char *np = (unsigned char *)&n;    return ((uint32_t)np[0] << 24) |        ((uint32_t)np[1] << 16) |        ((uint32_t)np[2] << 8) |        (uint32_t)np[3];}


There is no standard, but on many systems including <endian.h> will give you some defines to look for.