174
int mainO {
• if BYTE.ORDER — BIG.ENDIAN
printf("Porządek big-endian (4321)\nH);
•elif __BYTE_ORDER == __LITTLE.ENDIAN
printf("Porządek little-endian (1234)\nM);
#elif defined „PDP.ENDIAN kk __BYTE.ORDER == __PDP.ENDIAN
printf("Porządek PDP (3412)\n");
#else
printf ("Inny porządek «d)\n\ „BYTE.ORDER);
Sendif
return 0;
Na podstawie makra _BYTE_ORDEFl można skonstruować funkcję, która będzie konwertować liczb)’ pomiędzy porządkiem różnymi porządkami:
*include <endian.h> ftinclude <stdio.h> sinclude <stdint.h>
uint32_t convert_order32(uint32_t val, unsigned from, unsigned to) { if (from—to) { return val;
> else {
uint32_t ret ■ 0;
unsigned char tmp[5] ■ { 0, 0, 0, 0,0); unsigned char *ptr ■ (unsigned char«)&val; unsigned div ■ 1000;
do tmpffrom / div X 10] ■ •ptr*-»; while ((div /■ 10)); ptr * (unsigned char*)&ret; div ■ 1000;
do *ptr*+ ■ tnp[to / div X 10]; while ((div /■ 10)); return ret;
>
#def ine LE_T0.H(val) Sdefine H.T0_LE(val) idefine BE_T0_H(val) idefine H_T0_BE(val) •define PDP_T0_H(val) Sdefine H_T0_PDP(val)
convert_order32((val), convert_order32((val), convert_order32((val), convert_order32((val), convert_order32((val), convert_order32((val),
1234, __BYTE.ORDER)
__BYTE.ORDER, 1234)
4321, „BYTE.ORDER) „BYTE.ORDER, 4321) 3412. „BYTE.ORDER) „BYTE.ORDER, 3412)
int raain O
LE_T0_H(0x01020304)); H_T0_LE(0x01020304)); BE.T0_H(0x01020304)); H_T0_BE(0x01020304)); PDP_T0_H(0x01020304)); H_T0_PDP(0x01020304));
printf (*7,08x\n" , printf ("7,08x\n", printf ("7,08x\n", printf (,7,08x\n", printf ("7,08x\n", printf C7,08x\n", return 0;
Ciągle jednak polegamy na uiestaiKlardowym pliku nagłówkowym endian.h. Można go wyeliminować sprawdzając porządek bajtów w czasie wykonywania programu: