Share via


Detect target architecture endianess (in preprocessor time)

Question

Tuesday, March 6, 2012 2:58 AM

Hi everyone. I want to write some multiplataform/architecure code. In the *nix world there exists some #defines (BYTE_ORDER generally defined by sys/types.h inclusion). There exists something like this in the Windows world?

Thanks in advance.

Best regards

All replies (6)

Tuesday, March 6, 2012 3:50 AM

You can use something like

#define IS_BIG_ENDIAN (*(WORD *)"\0\x2" == 0x200)

Tuesday, March 6, 2012 5:32 AM

PabloGentle wrote:

Hi everyone. I want to write some multiplataform/architecure code. In  the *nix world there exists some #defines (BYTE_ORDER
generally defined by sys/types.h inclusion). There exists something  like this in the Windows world?

Does Windows actually run on any big-endian CPU? I doubt it (but don't  know for sure).

Igor Tandetnik


Tuesday, March 6, 2012 9:25 AM

Does Windows actually run on any big-endian CPU? I doubt it (but don't  know for sure).

IA64 is bi-endian, but Windows itself still uses its little-endian mode.

Answering policy: see profile.


Tuesday, March 6, 2012 9:27 AM

You can use something like

#define IS_BIG_ENDIAN (*(WORD *)"\0\x2" == 0x200)

Nice idea which unfortunately is incorrect.  Name the macro IS_LITTLE_ENDIAN (or negate the condition) and it will be correct.

Answering policy: see profile.


Tuesday, March 6, 2012 1:15 PM

Thank to all for the responses. I can't use a define like the suggested by Pierre because I need to use it to make others conditionals defines. I'll clarify with an example (OpenBSD, others *nixes take similar approaches):

In sys/endian.h :

.......

#define _LITTLE_ENDIAN    1234
#define _BIG_ENDIAN    4321

.......

In /sys/arch/sparc64/include/endian.h

........

#define    _BYTE_ORDER _BIG_ENDIAN

........

In /sys/arch/i386/include/endian.h

........

#define _BYTE_ORDER _LITTLE_ENDIAN

........

In my code:

#if BYTE_ORDER == LITTLE_ENDIAN

#define SOME_MACRO some endianess dependent code

#else

#define SOME_MACRO some (different) endianess dependent code

#endif

If there is not some similar think in windows I plan to use (According to Igor/David, in practice, windows always run in little endian archs (IA-64 is bi-endian but Windows use it in little *) ):

#ifdef _WIN32

#define _LITTLE_ENDIAN    1234

#define BYTE_ORDER LITTLE_ENDIAN

#endif

Thoughts?

* In IA-64 the processor starts in a predefined endianess mode an the OS set his operation mode is some early stage?

Thanks in advance!

Best regards!


Tuesday, March 6, 2012 3:18 PM

Thank to all for the responses. I can't use a define like the suggested by Pierre because I need to use it to make others conditionals defines. I'll clarify with an example (OpenBSD, others *nixes take similar approaches):

In sys/endian.h :

.......

#define _LITTLE_ENDIAN    1234
#define _BIG_ENDIAN    4321

.......

In /sys/arch/sparc64/include/endian.h

........

#define    _BYTE_ORDER _BIG_ENDIAN

........

In /sys/arch/i386/include/endian.h

........

#define _BYTE_ORDER _LITTLE_ENDIAN

........

In my code:

#if BYTE_ORDER == LITTLE_ENDIAN

#define SOME_MACRO some endianess dependent code

#else

#define SOME_MACRO some (different) endianess dependent code

#endif

If there is not some similar think in windows I plan to use (According to Igor/David, in practice, windows always run in little endian archs (IA-64 is bi-endian but Windows use it in little *) ):

#ifdef _WIN32

#define _LITTLE_ENDIAN    1234

#define BYTE_ORDER LITTLE_ENDIAN

#endif

Thoughts?

Well, you could have adapted Pierre's macro test easily enough, but testing for _WIN32 is probably sufficient.

Answering policy: see profile.