This construct is not legal in C, as far as I understand it. It is an aliasing violation to store data in one field of a union and read it from another. The compiler can do crazy things that would make you sad.
There's a series of macros that are the 'blessed' way of figuring out endianness. Here's what I do in one project I have: // This is all to figure out endian-ness and byte-swapping on various systems #if defined(HAVE_ENDIAN_H) #include <endian.h> // for the __BYTE_ORDER use below #elif defined(HAVE_SYS_ENDIAN_H) #include <sys/endian.h> // location on FreeBSD #elif defined(HAVE_MACHINE_ENDIAN_H) #include <machine/endian.h> // location on OS X #endif #if defined(HAVE_SYS_BYTEORDER_H) #include <sys/byteorder.h> // BSWAP_32 on Solaris 10 #endif #ifdef HAVE_SYS_ISA_DEFS_H #include <sys/isa_defs.h> // _BIG_ENDIAN/_LITTLE_ENDIAN on Solaris 10 #endif In linux (glibc), the macro __BYTE_ORDER is set to either __LITTLE_ENDIAN or __BIG_ENDIAN. Other systems do something similar. I can't guarantee all systems have a macro for this, though. craig -- ## List details at https://lists.exim.org/mailman/listinfo/pcre-dev
