第一个版本:
//return true on big-endian machines
bool check_big_endian1()
{
int a = 0;
int *p = &a;
*(char *)p = 1;//将4字节中首个字节(首个字节)设置成1,内存地址由低到高是\x01,\x00,\x00,\x00
return a != 1;//小端模式a=0x00000001,大端模式a=0x01000000(低地址的0x01被当成是int的高字节)
}
采用union的第二个版本:
//return true in big-endian machines
bool check_big_endian2()
{
union{
int a;
char b;
}var;//sizeof(var)=4
var.a = 1;
return var.b != 1;
}
避免函数调用的版本:
static union
{
int a;
char b;
}_s_var_endian_check = {1};
#define ISLITTLEENDIAN (_s_var_endian_check.b == 1)
#define ISBIGENDIAN !ISLITTLEENDIAN
这样就可以通过宏ISLITTLEENDIAN和ISBIGENDIAN读取静态变量的值来判断是否是小端模式或者大端模式了。
不过这是C的写法,C++里面可以采用内联(inline)函数来避开对宏的使用。
JavaScript版本
function isLittleEndian() {
var buf = new ArrayBuffer(2);
var view = new DataView(buf);
view.setInt16(0, 1, true); // 第三个参数指定以little endian写入数据
// 此时buf里的内存布局应该是(低地址到高地址) \x01 00
var i16 = new Int16Array(buf);
// 如果以little endian读取,它就是1;以big endian读取,则是1*256
return (i16[0] === 1);
}