字节序是字节在内存中存放顺序,分为大端存储与小端存储,那么如何通过代码来查看当前环境下的大小端字节序呢?本文采用两种方法,一是通过指针,二是通过联合体实现。以下以一个例子说明:
方法一指针:
指针方法还是比较容易理解的,如何拿到int型的低位字节,只需要把i的地址强转成char*的指针,我们知道char*指针访问内存时是一个字节一个字节访问,再解引用就能拿到低位的一个字节的数据。
代码实现
// 指针
int check_fun1()
{
int i=1;
return *((char*)(&i));
}
方法二联合体:
联合体实现还是比较有意思的,联合体成员有意思的一点是共用空间,一个联合体变量的大小至少是最大成员的大小。我们可以定义一个联合体,成员一个为cha类型,另一个为int型,只需要将int型成员初始化为1,然后返回char型成员就可以,返回1为小端,返回0为大端。
代码实现
// 联合体
int check_fun2()
{
union uu
{
char a;
int b;
}u;
u.b=1;
return u.a;
}
两种方法测试:
#include <stdio.h>
// 指针
int check_fun1()
{
int i=1;
return *((char*)(&i));
}
// 联合体
int check_fun2()
{
union uu
{
char a;
int b;
}u;
u.b=1;
return u.a;
}
int main()
{
int ret1=check_fun1();
int ret2=check_fun2();
if(ret1==1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
if(ret2==1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
运行结果:
vscode测试本机为小端存储