一道百度经典的笔试题-大小端的判断

这是我参与11月更文挑战的第29天,活动详情查看:2021最后一次更文挑战

最近,想复习一下C语言,所以笔者将会在掘金每天更新一篇关于C语言的文章! 各位初学C语言的大一新生,以及想要复习C语言/C++知识的不要错过哦! 夯实基础,慢下来就是快!


引出大小端

image.png

我们可以看到对于a和b分别存储的是补码。但是我们发现顺序有点不对劲。这是又为什么?


什么是大小端

大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;

小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中


为什么会有大小端

为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一 个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具 体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字 节,那么必然存在着一个如果将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。


百度笔试题

百度2015年系统工程师笔试题:

请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序。(10分)


分析

image.png

只要访问第一个字节,如果值为1,那就是小端,如果值为0,就是大端


只需要看第一个字节时0 还是1就能判断

-> 只取一个字节->强转为 char*


代码

写法1:硬核干

image.png

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:使用联合体

image.png

联合的成员共用一块内存空间,且都从起始位置开始存放,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)

union un
{
	char c;
	int a;
};
int check_sys()
{
	union un u;
	u.a = 1;
	return u.c;
}
复制代码

今天就先到这吧~感谢你能看到这里!希望对你有所帮助!欢迎老铁们点个关注订阅这个专题! 同时欢迎大佬们批评指正!

猜你喜欢

转载自juejin.im/post/7035808204206391326