什么是小端模式,什么是大端模式

2023-05-16

在这里插入图片描述

字节序

前言

内存在读写数据的时候,都是以字节为单位进行读写的,其最小的读写单位也是字节。一个字节占8位,如果暂且只考虑无符号数,那么其能表示的范围只有0 ~ 255这256个整数数值。如果将一个字节数据存入内存,那么将很好的对这一个字节的数据进行读写操作。然而,事实上却是,现实生活中的数据往往都是大于一个字节的,例如,在我们现在常用的PC机(32位或64位)中,占用一个字节的数据类型很少很少了,常见的就char,int都需要占用4个字节,double更是占用8个字节。就因为这个原因,对于这个大于一个字节的数据的存储就不得不用多个字节来对其进行存储了,那么现在问题就来了,这些大于一个字节的数据怎么对其进行读写操作的呢?

什么是字节序?

我们现在已经知道了,大于一个字节的数据在内存中的存储肯定也是大于一个字节的,但是呢,正所谓解决了多字节的存储问题,就引入了一个新的问题,那就是,多个字节的数据将怎么对其进行读写操作呢?

由此就引入了字节序这么个东西了。字节序,顾名思义,就是字节顺序。

现在不妨请大家想一想,如果我们这里有一个两字节的整数数据存在了内存当中,我们在对这个两字节的数据进行读取的时候,最大的问题是啥?

这里补充一下,刚提过的,内存数据的读写操作都是以字节为单位的,也就是一个字节一个字节的操作,并且是从内存的低地址向高地址方向的。在读取内存数据时候有两个基本的的操作,一个“随机”的,一个是“线性”的。“随机”的意思就是内存是个随机存储器,也就是我们常说的RAM((Random Access Memory),因此就能跳到内存的任意位置去读取那里的存储数据(这也是为啥我们内存条的访问速度比ROM快很多的一个原因)。“线性”的意思就是,在读取内存数据的时候,就得从随机读取的开始地址处,像一条直线一样的从低地址向高地址读取。

那么我们对这个两字节的数据进行读取的时候,最大的问题就莫过于是:我们当前读取的这个字节是这个两字节数据的高位还是低位呢?

假设,这个两字节的整数数据,其十六进制是:0x1234。我们现在读取到的一个字节是0x12,那么你怎么知道这个0x12是他的高字节还是他的低字节呢,如果这个都搞不清的话,那么在对数据进行读写的时候,肯定也都是错的。
也就是说,数据的低字节应该存在内存的高地址处还是低地址处?由此就出现了字节序,完整的说就是数据的以字节的方式进行存储的时候,其低位在内存中的存储顺序。这就是字节序

大端字节序、小端字节序

由于数据在内存中的存储顺序,就出现了两种顺序,并且是两种完全相反的顺序。

  • 1、小端字节序
    小端字节序,就是数据存储时,是数值的低字节存储在低地址处,高字节存储在高地址处。如下图:
    小端字节序
  • 2、大端字节序
    大端字节序,就是数据存储时,是数值的低字节存储在高地址处,高字节存储在低地址处。如下图:
    大端字节序
P.S. 这里的解释开头就是低字节存储在什么地址,而不是高字节存储在什么地址,方便记忆,因为低和小对应,高和大对应。并且,cpu读取内存都是从低地址开始读取的

其各自优势

  • 小端:因为低位在低地址处, 在做数据类型强制转换的时候,不需要再对字节进行调整了,因此数据类型强制转换的时候快。由于cpu对内存数据的读取都是线性的从低地址向高地址读取,因此读取速度快
  • 大端: 因为高位在低地址处,符号位的判断变得方便

这里分别解释下其各自优势的原因。

  • 小端: 当在做数据类型强制转换的时候有两种情况,一种是将低精度的向高精度的进行转换,这种转换,大小端字节序存储时都没啥影响,因为都无非是将转换后的高精度的的高位全部填充为零即可。例如,两字节的0x1234要转换为四字节,那么就只需将转换后的高位填零,也就变成了0x00001234。
    另一种就是高精度转换为低精度。这种强制数据类型转换必然会导致丢失一部分的精度,那么就得考虑丢弃掉哪部分的精度了。编译器对于这种方式的转换原则是,丢弃掉数值的高字节,只保留下低字节数据。例如,将两字节的数值0x1234强制转换为一字节,转换后的数值就是0x34。
    因为其低字节就是存储在低地址处,在做高精度强制类型转换成低精度的时候就不需要再对其进行字节上的调整了,因为我们刚说过,内存数据的读取是线性的,也就是低地址挨着读取的位置最近,那么在这种精度转换的时候,就能直接一口气拿到前面的低位数据 (也正是因为这个原因,cpu在读取内存数据的时候,不需要再移位到高地址处,因此节省了移位的操作,那么读取的时候就更快) 。那么大端字节序就还得先移位到高地址处才能拿到低位的数据

  • 大端: 众所周知,有符号位的时候,符号位都是存储在数据的最高一位的。刚好,大端字节序时,高位就是存储在离读取位置最近的低字节处,那么在获取符号位时就相对方便了很多,不需要再像小端字节序那样移位到高地址去取

结语

从这里可以看出,大小端字节序是各自互斥的,如果你选择了一种字节序,那么就必定要放弃另一种字节序。不同的CPU架构选择了其各自的字节序,小端的典型代表就是我们常见的x86架构的CPU,大端的典型代表就是IBM。如下:

  • 小端字节序: x86(例如:Intel和AMD),DEC

  • 大端字节序: IBM、PowerPC和Sun

  • ARM体系的CPU更是厉害,他们大小端都用,但是呢,具体ARM选择哪种字节序,这就得由硬件厂商决定了。

当然,字节序不仅仅存在于CPU访问内存时的概念,还包括了现在的文件存储啊,网络传输啊。网络字节序就是选择的大端字节序,bmp格式图片的存储就是选择的小端字节序。具体选择哪种就看其开发者自己咯。

参考书籍:《操作系统真象还原》 – 郑钢著

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是小端模式,什么是大端模式 的相关文章

随机推荐

  • 智慧农业物联网方案

  • 智慧水务解决方案

  • 步进电机低频震动问题

    现象 xff1a 步进电机转速慢的情况下会产生震动原因 xff1a 本身的两个特性 xff1a 矩频特性 低频特性 xff08 1 xff09 矩频特性 xff1a 研控57步进电机 启动时脉冲频率过高 xff0c 电机输出扭矩较小 xff
  • ROS采集GPS/北斗数据在百度地图中可视化位置

    关注微信公众号 混沌无形 xff0c 后台回复 xff1a 13462F2 免费获取完整工程源码 xff01 基于USB RS232协议输出UM220 III 3 N 北斗GPS模块定位信息 xff0c 使用ROS与js的接口包 rosli
  • 麦克纳姆轮优缺点

    关注同名微信公众号 混沌无形 xff0c 阅读更多有趣好文 xff01 原文链接 xff1a https mp weixin qq com s sjb3O91auADKN7iDsut0jA xff08 包含原文PDF百度云下载链接 xff0
  • 常见移动机器人轮直径校准(图片版)

    关注同名微信公众号 混沌无形 xff0c 阅读更多有趣好文 xff01 原文链接 xff1a 差速驱动机器人轮间距校准 xff08 包含原文PDF百度云下载链接 xff09 精彩的理论论证过程见原文链接 xff08 含全文下载链接 xff0
  • 将博客搬至CSDN

    对与 H 由于AC CE 所以 CAB 61 H 39 61 H 此时满足 tan H 61 tan H 39 61 Lrt 1 39 hz2 tan H 61 tan H 39 61 Lrt 1 39 xff08 1 xff09 可由角速
  • JNI开发C调用Java的方法和构造函数(三)

    前言 JNI的基本使用 xff0c C中调用Java的成员变量 xff0c 成员属性 xff0c 构造方法 xff0c 方法 提示 xff1a 以下是本篇文章正文内容 xff0c 下面案例可供参考 一 JNI的上下文 xff1f 大家知道在
  • 常见移动机器人运动学模型总结

    文末有彩蛋 原文及其原文中所涉及文章的PDF xff08 共9篇 xff09 免费下载 混沌无形 混沌系统是世界本质 xff0c 无形之中存在规律 机器人智能化发展从线性过渡到混沌 xff0c 本号将分享机器人全栈技术 xff08 感知 规
  • 常见移动机器人多角度对比分析

    混沌无形 混沌系统是世界本质 xff0c 无形之中存在规律 机器人智能化发展从线性过渡到混沌 xff0c 本号将分享机器人全栈技术 xff08 感知 规划 控制 xff1b 软件 机械 硬件等 xff09 43篇原创内容 公众号 文末提供原
  • 设计搭建汽车机器人(M1)

    p 文末提供原文PDF免费下载 期刊论文版式 摘要 xff1a 汽车机器人是移动机器人类型中非常典型的一种 xff0c 本文从应用需求 场景等角度分析 xff0c 详细阐述汽车机器人MCR的本体设计 硬件系统设计及软件系统设计情况 xff0
  • STM32F103mini教程学习总结与心得(一)

    关注同名微信公众号 混沌无形 xff0c 阅读更多有趣好文 xff01 1 引脚是否兼容5V的判断 xff1a 引脚表中PF表示5V xff0c 原理图中有ADC的引脚为3 3V 2 PT xff1a 容忍5V xff0c 没有PT标示 x
  • STM32F103mini教程学习总结与心得(二)---->串口通信

    关注同名微信公众号 混沌无形 xff0c 阅读更多有趣好文 xff01 一 串口原理 1 处理器与外部设备通信的两种方式 xff1a 并行通信 xff08 速度快 xff0c 占用资源多 xff09 43 串行通信 xff08 反之 xff
  • 电源管理与驱动设计笔记

    关注同名微信公众号 混沌无形 xff0c 阅读更多有趣好文 xff01 1 电源管理的功能 xff1a 具备电压过高保护 电流过大保护 电量监测 过放保护 等功能 gt 自主充电 2 一款清洁机器人的运动控制系统方案设计示意图 2 1电源充
  • (4)(4.3) 将固件加载到已有ArduPilot固件的主板上

    文章目录 前言 1 将自动驾驶仪连接到电脑 2 选择COM端口 3 安装固件 4 使用测试版和开发版 4 1 测试版 4 2 最新开发版本 4 3 自定义固件构建服务器 5 测试 前言 这些说明将告诉你如何将最新的固件下载到已经安装了 Ar
  • 【MDK KEIL】keil添加文件夹目录结构(批量添加.c和.h文件到工程中)(keil添加头文件路径)

    第一步打开创建文件夹选项 xff1a 第二步 xff1a 直接创建删除 或者上移下移 就好了 3 添加文件夹的同时别忘记导入头文件 xff1a
  • 单片机IO详解(上拉 下拉 准双向 输入 输出 推挽 开漏)

    目录 上拉 xff1a 下拉 输入 xff1a 上拉输入 下拉输入 输入浮空 模拟 施密特输入 xff1a 三态输入 xff1a 输出 复用推挽和推挽输出区别 推挽输出特点 开漏输出 xff1a 准双向口 一般单片机都会提供上拉和下拉功能
  • 局部路径规划算法——实现DWA(dynamic window approach)控制空间采样

    DWA算法是局部路径规划算法 xff0c 在全局路径规划算法完成后 xff0c DWA算法能够根据当前小车 xff08 机器人 xff09 位置 障碍物 终点的位置进行控制空间 xff08 速度 角速度 xff09 的采用 xff0c 从而
  • make和cmake简要介绍

    GCC GCC xff08 GNU Compiler Collection xff0c GNU编译器套件 xff09 是由GNU开发的编程语言译器 GNU编译器套件包括C C 43 43 Objective C Fortran Java A
  • 什么是小端模式,什么是大端模式

    字节序 前言 内存在读写数据的时候 xff0c 都是以字节为单位进行读写的 xff0c 其最小的读写单位也是字节 一个字节占8位 xff0c 如果暂且只考虑无符号数 xff0c 那么其能表示的范围只有0 255这256个整数数值 如果将一个