C/C++/js判断CPU 是小端存储(Little endian)还是大端存储(Big endian)模式

第一个版本:

//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);
}





  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值