这是我参与11月更文挑战的第29天,活动详情查看:2021最后一次更文挑战」
最近,想复习一下C语言,所以笔者将会在掘金每天更新一篇关于C语言的文章! 各位初学C语言的大一新生,以及想要复习C语言/C++知识的不要错过哦! 夯实基础,慢下来就是快!
引出大小端
我们可以看到对于a和b分别存储的是补码。但是我们发现顺序有点不对劲。这是又为什么?
什么是大小端
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中
为什么会有大小端
为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一 个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具 体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字 节,那么必然存在着一个如果将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。
百度笔试题
百度2015年系统工程师笔试题:
请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序。(10分)
分析
只要访问第一个字节,如果值为1,那就是小端,如果值为0,就是大端
只需要看第一个字节时0 还是1就能判断
-> 只取一个字节->强转为 char*
代码
写法1:硬核干
int main()
{
int a = 1;
char* p (char*)&a;
if(*p == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
复制代码
写法2:写成函数形式
如果是小端返回1 大端返回0
//如果是小端返回1 大端返回0
int check_sys()
{
int a = 1;
char* p = (char*)&a;
if(*p == 1)
{
return 1;
}
else
{
return 0;
}
}
int main()
{
int ret = check_sys();
if(ret == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
复制代码
写法3-再优化
//小端返回1 ,大端返回0s
int check_sys()
{
int a = 1;
char*p = (char*)&a;
return *p; //p为char类型,解引用之后访问一个字节
}
复制代码
写法4-最优化
//小端返回1 ,大端返回0s
int check_sys()
{
int a = 1;
return *(char*)&a;
}
复制代码
方法2:使用联合体
联合的成员共用一块内存空间,且都从起始位置开始存放,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)
union un
{
char c;
int a;
};
int check_sys()
{
union un u;
u.a = 1;
return u.c;
}
复制代码
今天就先到这吧~感谢你能看到这里!希望对你有所帮助!欢迎老铁们点个关注订阅这个专题! 同时欢迎大佬们批评指正!