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

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

引出大小端

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;
}
复制代码


相关文章
|
3月前
|
存储 小程序 C语言
C语言数据的存储(内含百度笔试题)
C语言数据的存储(内含百度笔试题)
40 4
|
6月前
|
算法 网络协议 NoSQL
百度后端笔试题知识点总结
百度后端笔试题知识点总结
79 0
|
小程序
百度2015年系统工程师笔试题:判断当前机器的大小端
百度2015年系统工程师笔试题:判断当前机器的大小端
66 0
|
小程序
百度2015年系统工程师笔试题
百度2015年系统工程师笔试题
|
编译器 程序员 C语言
程序的编译与链接(预处理详解)+百度面试笔试题+《高质量C/C++编程指南》笔试题
如果两者之间有任何空白存在,参数列表就会被解释为stuff的一部分。
109 0
|
存储 小程序
|
人工智能 算法 BI