网站首页 > 文章精选 正文
我在上一个专题中,讲联合体的应用时,有朋友提到了关于大小端的问题。我感觉我在回复里也没有讲得太清楚,我就专门再开一个专题来探讨一下。同时在这里,也欢迎大家一起来讨论,也欢迎大家关注我的头条号。
首先我们先来搞清楚一个问题,
为什么会有大小端的区别?
对于一个处理器来讲,一般是一个字节(byte)的存储空间对应一个唯一的地址。8位的处理器不存在大小端的问题,这个问题主要针对的是16位和32位的处理器。以32位处理器为例,我们说的32位,实际就是指的处理器的地址总线是32位的。也就是说,在32位处理器的存储空间里,每一个字节对应一个32位地址,当然这个地址是唯一的。那么我们在处理一个字(word)的时候,也就是4个字节(byte),要把这4个字节分别放入4个连续的地址中,一般也就是两种方式。一种低位在前,byte0放在低地址中,再从byte1到byte3依次按顺序往后放;另一种高位在前,byte3放在低地址中,再从byte2到byte0依次按顺序往后放。前面这一种方式,就叫做小端模式;后面这一种方式,就叫做大端模式。
上图就是数值0x1,在小端模式和大端模式下的不同存储方法。
大小端模式取决于芯片内核
由此,我们可以看出大小端不同的模式,完全取决于芯片的内核。各个芯片设计公司,对此有各自自己的玩法。这也不能完全怪人家,为什么不统一标准。现实中,有好多设计有时候是设计者刻意为之,后者往往为了区别于前者的设计,而采取另外一条路,实际上是殊途同归。但是这样做却可以规避一个叫做“专利”的东西。
针对大小端数据结构的定义
为了程序能够跨平台使用,我们也经常定义这样的数据结构,
typedef union
{
t_uint32 Word;
struct
{
#if ENDIAN_MODE == BIG_END
t_uint8 Byte3;
t_uint8 Byte2;
t_uint8 Byte1;
t_uint8 Byte0;
#else
t_uint8 Byte0;
t_uint8 Byte1;
t_uint8 Byte2;
t_uint8 Byte3;
#endif
}Byte;
}un_uint32;
如果是大端模式,你可以将ENDIAN_MODE定义成BIG_END,否则你就定义成LITTLE_END,你可以选择默认小端模式。现在基本上是arm内核大行其道,arm内核既支持小端模式又支持大端模式,但是也是默认小端模式。这也算是回答了网友提出来的问题。
与大小端问题类似的,还有LSB和MSB的问题,在这里也一起讨论一下。
数据通讯中LSB和MSB
在数据通讯中,一般数据流有两种通讯方式:LSB和MSB。LSB,低位在前,也就是低位先发;MSB,高位在前,也就是高位先发。我看有些文章里,把这个问题和大小端问题,混为一谈,我个人其实不太认同。一个是针对数据通信,一个是针对数据存储,虽然都是在定义先后顺序。你要是非要说数据存储还不是由数据传输决定的,先传输谁就先存储谁,那也算是这两个问题在一定程度上的统一。
但是, 我还是觉得把这两个问题分开来对待还是比较好。如果硬要把这两个问题都归类到一起,那也是在完全理解各自问题的基础之上。
- 上一篇: 字节序探析:大端与小端的比较(大端字节序怎么转换成小端)
- 下一篇: 3个字让你记住单片机的大小端模式
猜你喜欢
- 2025-07-21 [西门子PLC] 两个S7-1200之间实现Modbus TCP客户端和服务器通信
- 2025-07-21 谈谈西门子PLC中的字位变换(西门子plc的字和位)
- 2025-07-21 史上最全齿轮类型介绍及主要参数计算与画法详解
- 2025-07-21 机械设计中的尺寸标注(机械设计中的尺寸标注,看懂复杂机械图纸)
- 2025-07-21 FANUC 0iTF 车床编程 G90 车削锥度指令
- 2025-07-21 C语言验证大小端的几个方法(用c语言实现大小端的测试)
- 2025-07-21 机器人也要“减重”? 机械臂用上碳纤维复合材料,性能或大有提升
- 2025-07-21 揭秘通信协议设计的奥妙,作为面试官我都看蒙了
- 2025-07-21 新手攻略!入门ARM必须要理解的22个常用概念
- 2025-07-21 NPT 螺纹与英制螺纹的区别大揭秘(英制螺纹和npt)
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)
- fmt.println (52)