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

引出大小端

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

我们可以看到对于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;
}
复制代码


上一篇:经典递归 - 青蛙跳台阶问题


下一篇:不得不了解的整形提升问题