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

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

引出大小端

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


相关文章
|
机器学习/深度学习 人工智能 测试技术
Meta无限长文本大模型来了:参数仅7B,已开源
【4月更文挑战第26天】Meta 研究团队推出7亿参数的MEGALODON,这是一个专为无限长文本序列建模设计的神经网络架构。通过复数指数移动平均(CEMA)和时间步归一化层等技术创新,MEGALODON在效率和准确性上超越Transformer,且在多种基准测试中表现优秀。源代码已开源,为长序列建模提供新工具,但面临资源限制和处理极端长度序列的挑战。[论文链接](https://arxiv.org/pdf/2404.08801.pdf)
408 3
|
缓存 Java
java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁
本文介绍了几种常见的锁机制,包括公平锁与非公平锁、可重入锁与不可重入锁、自旋锁以及读写锁和互斥锁。公平锁按申请顺序分配锁,而非公平锁允许插队。可重入锁允许线程多次获取同一锁,避免死锁。自旋锁通过循环尝试获取锁,减少上下文切换开销。读写锁区分读锁和写锁,提高并发性能。文章还提供了相关代码示例,帮助理解这些锁的实现和使用场景。
341 4
java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁
|
机器学习/深度学习 人工智能 算法
未来已来:探索量子计算在Web开发中的应用
在这篇文章中,我们将穿越技术的迷雾,一窥未来。量子计算,这一曾经只存在于理论中的技术,正逐渐走近现实,它的革命性潜力正在被探索其在Web开发中的潜在应用。本文将带你了解量子计算的基本概念,以及它可能如何重塑我们构建和交互Web应用的方式。准备好,让我们的想象力随着量子比特一起跳跃。
|
UED 开发者
flutter:view (九)
本文介绍了Flutter中多种滚动组件的使用方法,包括`SliverAppBar`、`PageView`、`NestedScrollView`、`ListView`、`GridView`、`SingleChildScrollView`等。具体展示了如何构建可滑动的页面布局,如实现下拉刷新、无限循环的轮播图、带标题栏的嵌套滑动视图、列表视图的不同形式(如水平列表、带有分隔线的列表)以及自定义的滚动视图。还提供了监听滚动距离、滑动到指定位置等高级功能的实现代码示例。这些组件和技巧对于开发具有丰富交互效果的移动应用非常有用。
180 0
|
数据采集 机器学习/深度学习 人工智能
云服务器可以用来做什么?云服务器使用场景列举
阿里云服务器经常推出一些拼团或者秒杀活动,很多同学看价格不错就抢了。可是云服务器买到手却不知道做什么,新手站长网列举云服务器常见的使用场景,方便大家参考,别再让你的云服务器吃灰了
2330 1
|
JavaScript Java 测试技术
Java项目基于ssm+vue.js的经典电影推荐网站附带文章和源代码设计说明文档ppt
Java项目基于ssm+vue.js的经典电影推荐网站附带文章和源代码设计说明文档ppt
136 0
【随想】每日两题Day.19
【随想】每日两题Day.19
113 0
|
设计模式 敏捷开发 算法
编码之道:从简单到复杂的技术领悟之旅
【5月更文挑战第15天】 在编程的世界里,我们往往从简单的代码片段开始,逐步踏入复杂系统的构建之中。本文通过作者的个人技术成长历程,探讨了从基础语法学习到高级架构设计过程中的心路历程和技术积累。文章不仅涉及具体的编程语言和工具,还着重于软件开发中的思维模式和解决问题的策略,旨在为读者揭示一条由表及里,由浅入深的技术提升之路。
Webpack5 系列(四):Babel 的配置2
Webpack5 系列(四):Babel 的配置2
248 1