之前写过一篇“如何判断机器的CPU是大端还是小端?http://www.orangespeech.com/?p=89”的blog, 现在更新一下开源代码中的简洁实现:
int IsLittleEndian() { int check = 1; return (*reinterpret_cast<char*>(&check) != 0); }
C的实现如下:
#define BIG_ENDIAN 0 #define LITTLE_ENDIAN 1 int little_endian(void) { short int w = 0x0001; char *byte = (char *) &w; return(byte[0] ? LITTLE_ENDIAN : BIG_ENDIAN); }
顺带给出字节交换的代码,同样厉害!
#define SWAP8(a) { \ int t = ((char*)&a)[0]; ((char*)&a)[0]=((char*)&a)[7]; ((char*)&a)[7]=t;\ t = ((char*)&a)[1]; ((char*)&a)[1]=((char*)&a)[6]; ((char*)&a)[6]=t;\ t = ((char*)&a)[2]; ((char*)&a)[2]=((char*)&a)[5]; ((char*)&a)[5]=t;\ t = ((char*)&a)[3]; ((char*)&a)[3]=((char*)&a)[4]; ((char*)&a)[4]=t;} #define SWAP4(a) { \ int t = ((char*)&a)[0]; ((char*)&a)[0]=((char*)&a)[3]; ((char*)&a)[3]=t;\ t = ((char*)&a)[1]; ((char*)&a)[1]=((char*)&a)[2]; ((char*)&a)[2]=t;} #define SWAP2(a) { \ int t = ((char*)&a)[0]; ((char*)&a)[0]=((char*)&a)[1]; ((char*)&a)[1]=t;}