0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

你真的懂CPU大小端模式吗?

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 作者:黄工的嵌入式技术 2020-02-27 16:46 次阅读

通信协议中的数据传输、数组的存储方式、数据的强制转换等这些都会牵涉到大小端问题。 CPU的大端和小端模式很多地方都会用到,但还是有许多朋友不知道,今天暂且普及一下。 一、为什么会有大小端模式之分呢?

因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。

但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的int型。另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。

例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。

对于大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反。

二、什么是大端和小端?大端模式:是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。

小端模式:是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。

假如32位宽(uint32_t)的数据0x12345678,从地址0x08004000开始存放:

0x08004003 0x12 0x78
0x08004002 0x34 0x56
0x08004001 0x56 0x34
0x08004000 0x78 0x12
地址 小端存放内容 大端存放内容

再结合一张图进行理解:

从上面表格、图可以看得出来,大小端的差异在于存放顺序不同。 在维基百科中还有有一段关于“端的起源”:

三、数组在大端小端情况下的存储以unsigned int value = 0x12345678为例,分别看看在两种字节序下其存储情况,我们可以用unsigned char buf[4]来表示value。 1.大端模式下

高地址 buf[3] 0x78 低位
- buf[2] 0x56 -
- buf[1] 0x34 -
低地址 buf[0] 0x12 高位
地址 数组 位置

2.小端模式下

高地址 buf[3] 0x12 低位
- buf[2] 0x34 -
- buf[1] 0x56 -
低地址 buf[0] 0x78 高位
地址 数组 位置

不知道大家对数组进行强制转换成整型数据没有? 如果你要进行强制转换,肯定要考虑大小端问题。 四、大小端谁更好?

小端模式:强制转换数据不需要调整字节内容,1、2、4字节的存储方式一样。

大端模式:符号位的判定固定为第一个字节,容易判断正负。

总结:大端小端没有谁优谁劣,各自优势便是对方劣势。

五、常见字节序

常见的操作系统是小端,通讯协议是大端。

1.常见CPU的字节序

大端模式:PowerPC、IBM、Sun

小端模式:x86、DEC

ARM既可以工作在大端模式,也可以工作在小端模式。

(内容来自网络

2.STM32属于小端模式

测试一款MCU属于大端,还是小端方法很多种,通过打印数据,通过在线调试查看数据:

当然,在MCU的手册中也有相关说明。

六、大小端转换

开篇说了,实际应用中,大小端应用的地方很多通信协议、数据存储等。如果字节序不一致,就需要转换。

只要你理解其中原理(高低顺序),转换的方法很多,下面简单列列两个。

1.对于16位字数据

#define BigtoLittle16(A) (( ((uint16)(A) & 0xff00) >> 8) | (( (uint16)(A) & 0x00ff) << 8))

2.对于32位字数据

#define BigtoLittle32(A) ((( (uint32)(A) & 0xff000000) >> 24) | (( (uint32)(A) & 0x00ff0000) >> 8) | (( (uint32)(A) & 0x0000ff00) << 8) | (( (uint32)(A) & 0x000000ff) << 24))

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 通信协议
    +关注

    关注

    28

    文章

    722

    浏览量

    39580
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10333

    浏览量

    206222
  • 计算机系统
    +关注

    关注

    0

    文章

    209

    浏览量

    23834
收藏 人收藏

    评论

    相关推荐

    **模电和数电的区别和联系,真的懂吗?**

    模电和数电的区别和联系,真的懂吗? 数电:我比你更能抗干扰。模电:我比你的精度高。数电:我可以实现各种算法。模电:我可以实现无线通讯。数电:没有我,电子行业还得倒退几十年呢。模电:没有我,还只
    发表于 03-01 08:43

    如何估算S7-1500 CPU的装载存储区在SIMATIC存储卡上的大小

    S7-1500 CPU 的装载存储区在 SIMATIC 存储卡上。根据以下操作步骤可以确定用户程序所需要的存储区的大小以便确定所需存储卡的大小
    的头像 发表于 01-29 10:00 193次阅读
    如何估算S7-1500 <b class='flag-5'>CPU</b>的装载存储区在SIMATIC存储卡上的<b class='flag-5'>大小</b>?

    求助,请问STM32的FSMC可以配置大小吗?

    STM32的FSMC可以配置大小么。
    发表于 01-17 08:22

    AD8130是可以单工作的,但是为什么用Multisim仿真的时候输出只有一个直流偏置呢?

    根据芯片手册,AD8130是可以单工作的,但是为什么用Multisim仿真的时候输出只有一个直流偏置呢?
    发表于 11-23 07:48

    天玑9300是真的强,安卓旗舰认准全大核CPU

    近日,联发科宣布推出全新天玑9300旗舰5G生成式AI移动芯片,该芯片凭借其高智能、高性能、高能效以及低功耗的特点,赢得了众多数码爱好者的喜爱。在此之前,关于天玑9300所使用的创新全大核CPU架构
    的头像 发表于 11-09 16:58 229次阅读
    天玑9300是<b class='flag-5'>真的</b>强,安卓旗舰认准全大核<b class='flag-5'>CPU</b>

    请问如何配置STM32的FSMC的大端模式模式

    请问如何配置STM32的FSMC的大端模式模式?还是硬件确定好了的不能修改?
    发表于 11-07 15:15

    STM32中的FLASH数据是大端模式还是小模式

    怎么判断STM32的FLASH数据是大端模式还是小模式
    发表于 10-13 07:21

    数据存储中的大小指是什么意思?

    数据存储中的大小指是什么意思
    发表于 10-13 06:20

    iar编译器是大端模式还是小模式的?

    iar编译器是大端模式还是小模式
    发表于 09-25 08:00

    keil怎么设置大端和小模式

    keil怎么设置大端和小模式,用于stm32
    发表于 09-21 07:46

    JSF业务线程池的大小配置用例说明

    JSF 业务线程池使用 JDK 的线程池技术,缺省情况下采用 Cached 模式(核心线程数 20,最大线程数 200)。此外,还提供了 Fixed 固定线程大小模式,两种模式均可设
    的头像 发表于 09-19 11:15 501次阅读

    S7-1200:CPU的操作模式有哪几种

    CPU 有以下三种操作模式:STOP 模式、STARTUP 模式和 RUN 模式CPU
    的头像 发表于 09-19 10:58 3009次阅读
    S7-1200:<b class='flag-5'>CPU</b>的操作<b class='flag-5'>模式</b>有哪几种

    电感大小的影响因素

    从空芯线圈的计算公式可以看出,电感量的大小跟线圈圈数平方成正比,圈数的多少直接会影响电感量的大小,也是影响电感量大小的最主要的因素之一。
    的头像 发表于 09-09 14:37 3368次阅读

    兆芯CPU+GPU+芯片组技术路线

    CPU“ 和“芯片组”分立模式,系统瓶颈在两者之间的主板总线, SOC变片外为片内、解决了这- -瓶颈;
    发表于 07-15 15:23 538次阅读
    兆芯<b class='flag-5'>CPU</b>+GPU+芯片组技术路线

    教程:如何更改 RAM 大小以降低 DA14585/586 设备在扩展睡眠模式下的功耗

    教程:如何更改 RAM 大小以降低 DA14585/586 设备在扩展睡眠模式下的功耗
    发表于 07-06 19:45 0次下载
    教程:如何更改 RAM <b class='flag-5'>大小</b>以降低 DA14585/586 设备在扩展睡眠<b class='flag-5'>模式</b>下的功耗