人总要呆在一种什么东西里,沉溺其中。苟有所得,才能证实自己的存在,切实地括出自己的价值。
——《一定要,爱着点什么》
在上次数据存储的整形篇我们提到了大小端存储(下面是博客链接)
今天我们来用代码测试大小端 (来判断当前机器的字节序)。
在2015年百度的系统工程师笔试题中出了一道相关试题:
请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序。(10分)
由此可见了解大小端相关知识以及可以判断是大端还是小端还是有点重要的 OvO
(一)指针法
我们首先可以创建一个整形变量 i ,那么 i 在内存中的可能的表示方式有下面两种
我们创建 char*p (因为*p其实就是访问1个字节,,而int是4个字节,所以*p可以访问 i 的第一个字节。),可以令p=(char*)&i,然后返回*p的值。如果是小端*p就会拿取01,返回1,如果是大端*p就会拿取01返回0。
代码如下:
#include <stdio.h>
int check_sys()
{
int i = 1;
char *p = NULL;
p = (char*)&i ;
return (*p);
}
int main()
{
int ret = check_sys();
if(ret == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
结果:
(二)联合体(共用体)法
我们知道,在联合体中,联合的成员是共用同一块内存空间的,所以我们可以定义一个int i = 1,并且在联合体中创建char c ,因为int 占4个字节,而char只访问第一个字节,所以只要返回 c 就可以取得i的第一个字节。以此来判断是大端还是小端。
代码如下:
int check_sys()
{
union
{
int i;
char c;
}un;
un.i = 1;
return un.c;//返回 c 的值
}
int main()
{
int ret = check_sys();
if(ret == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
结果:
以上就是判断大小端的两种方法,希望对大家有所帮助。