这里不详细讲解大小端的区别,只讲解判断大小端的方法。
1.大端,小端的区别
0x123456 在内存中的存储方式
大端是高字节存放到内存的低地址
小端是高字节存放到内存的高地址
2.大小端的判断
1.错误的做法
int main()
{
int a=0x1234;
char c=(char)a;
if(c==0x12)
cout<<"大端\n";
else
cout<<"小端\n";
return 0;
}
应该有不少人是这样想的。直接就强制类型转换。
但是,int型数值赋给char型变量时,只保留其最低8位,高位部分舍弃。
所以在大端环境进行测试,这个例子也只能得到c==0x34,也即是小端。
强制类型转换等运算是编译器提供的运算,这个运算是高于内存层次的。
2.正确的做法
int main()
{
int a = 0x12345678;
char b = *((char *)(&a)); // 指针方式,取地址
if(0x78 == b)
cout<<"小端\n"
else if(0x12 == b)
cout<<"大端\n";
return 0;
}
取地址做法才是正确的。
还有一种使用联合体union做法,这种本质就是取地址做法。
3.总结
意识到直接进行强制类型转换来判断大小端是错误的。而虽然取地址方法也用到了强制类型转换,但其进行内存调用,取地址的,是可行的。