1.题目:
请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序。(10分)
2.大小端概念:
大小端介绍:
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。
3.解法
判断该机器为大小端存储模式,既需要判断存进去一个数据存储的顺序为数据本身顺序还是反过来。比如创建一个变量a:int a = 1
,看他存进去的是00 00 00 01
还是01 00 00 00
,我们再进一步想,是否只需要判断最左边第一个为00还是01就可以判断大小端?答案是是的。
那如何取出第一个数值呢,我们可以利用强制类型转换,让char *
来得到这个第一位的数值,再判断是0还是1后输出即可。
代码1(正常解法):
int main()
{
int a = 1;
char* p = (char*)&a;
if (*p == 1)
{
printf("该机器存储模式为小端存储模式");
}
else
{
printf("该机器存储模式为小端存储模式");
}
return 0;
}
代码2(自定义函数):
int check_sys()
{
int a = 1;
char* p = (char*)&a;
return *p;
//大端返回0,小端返回1
//也可以直接return *(char*)&a;
}
int main()
{
int ret = check_sys();
if (ret == 1)
{
printf("该机器存储模式为小端存储模式");
}
else
{
printf("该机器存储模式为小端存储模式");
}
return 0;
}
代码3(联合体):
联合体可以将多个基础类型共用一个空间,如
union {
int i;
long l;
double d;
};
这个联合体就包含了3个基础类型,整形,长整形,双精度型,分配空间的时候就分配是double 的空间, 他们共用这段空间。而结构体分配则是 这3种之和的空间量。
int check_sys()
{
union
{
int i;
char c;
}un;
un.i = 1;
return un.c;
}
int main()
{
int ret = check_sys();
if (ret == 1)
{
printf("该机器存储模式为小端存储模式");
}
else
{
printf("该机器存储模式为小端存储模式");
}
return 0;
}