This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Re: Robust detection of endianness at compile time.
- From: Nick Maclaren <nmm1 at cus dot cam dot ac dot uk>
- To: gcc-help at gcc dot gnu dot org
- Date: Tue, 31 Jul 2007 14:29:16 +0100
- Subject: Re: Robust detection of endianness at compile time.
Andrew Haley <aph-gcc@littlepinkcloud.COM> wrote:
>
> It would work on gcc, because gcc allows members of a union to be
> written as one type and read as a different incompatible type. Other
> C compilers allow this too. However, it's is not guaranteed by the
> language standards, so it doesn't much help you with truly portable
> code.
Right. It is also a bad idea to use 'register', as some compilers
incorrectly use it to change representation - or they used to.
The safest and most portable code involves setting a variable to
a known value, reading each byte of the variable as an unsigned
char, and using AI to deduce the endianness.
For integers in C99 or on any system with a fairly conventional
binary representation (don't ask), you can generate a translation
table directly by storing (say) (0<<24)+(1<<16)+(2<<8)+3 and using
the result as unsigned char [4].
Doing the same for IEEE 754 formats is left as an exercise for
the reader :-) I have done it often enough, but it is tedious.
If you are faced with doing this for a system with integers that
don't match C99's model, or with floating-point that doesn't have
a base of 2 or 16, real numbers that are not floating-point or
anything similar, then please contact me by Email before I retire.
That isn't entirely a joke :-)
Regards,
Nick Maclaren,
University of Cambridge Computing Service,
New Museums Site, Pembroke Street, Cambridge CB2 3QH, England.
Email: nmm1@cam.ac.uk
Tel.: +44 1223 334761 Fax: +44 1223 334679