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

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

引出大小端

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


相关文章
|
7月前
【一刷《剑指Offer》】面试题 10:二进制中 1 的个数
【一刷《剑指Offer》】面试题 10:二进制中 1 的个数
|
编译器 C语言 开发者
掌握指针和数组:经典笔试题攻略(万字详解)(上)
掌握指针和数组:经典笔试题攻略(万字详解)(上)
56 0
|
7月前
指针经典笔试题强训(附图详解)
指针经典笔试题强训(附图详解)
58 0
|
7月前
|
存储 Java 编译器
经典指针笔试题你会了嘛
经典指针笔试题你会了嘛
81 0
|
存储 编译器 C语言
掌握指针和数组:经典笔试题攻略(万字详解)(下)
掌握指针和数组:经典笔试题攻略(万字详解)(下)
76 0
|
存储 C++
大厂经典指针笔试题
大厂经典指针笔试题
|
小程序
百度2015年系统工程师笔试题:判断当前机器的大小端
百度2015年系统工程师笔试题:判断当前机器的大小端
79 0
|
网络协议 编译器 C语言
【指针笔试题上】你知道大厂面试题的指针题是什么样的吗?快来通过这些面试题目检测一下自己吧!
【指针笔试题上】你知道大厂面试题的指针题是什么样的吗?快来通过这些面试题目检测一下自己吧!
54 0
|
存储 C语言 C++
【指针笔试题下】你知道大厂面试题的指针题是什么样的吗?快来通过这些面试题目检测一下自己吧!
【指针笔试题下】你知道大厂面试题的指针题是什么样的吗?快来通过这些面试题目检测一下自己吧!
108 0
|
算法 测试技术 C语言
【数组和进阶指针经典笔试题12道】这些题,满足你对数组和指针的所有幻想,come on !
【数组和进阶指针经典笔试题12道】这些题,满足你对数组和指针的所有幻想,come on !
125 0
【数组和进阶指针经典笔试题12道】这些题,满足你对数组和指针的所有幻想,come on !