小端模式和大端模式_听说过CPU大小端模式吗?

c2f241b9111553f02b722cf7b92c0ea5.png

通信协议中的数据传输、数组的存储方式、数据的强制转换等这些都会牵涉到大小端问题。 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开始存放:

地址小端存放内容大端存放内容
0x080040030x120x78
0x080040020x340x56
0x080040010x560x34
0x080040000x780x12
再结合一张图进行理解:

fa976721c176c3856151e5cc50833225.png

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

dff5e865f34dcee405c2e18e03bc2104.png

三、数组在大端小端情况下的存储 以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属于大端,还是小端方法很多种,通过打印数据,通过在线调试查看数据:

dc37442a62554a17006e028e5fe85bf9.png

当然,在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))

方法很多种,感兴趣的朋友可自行研究。本文就写到这里,希望对你有帮助。

75415d354e7ab66c04d88087cd1dae36.png1.国产嵌入式操作系统技术与产业发展论坛暨嵌入式系统联谊会主题讨论会嘉宾揭晓!

2.编程语言趋势预测:Rust 将成为主流,React 继续统治编程世界

3.教你如何使用TouchGFX之快速创建滑动应用

4.如今的FPGA走错路了吗?

5.华为手机到底用了多少美国芯?

6.10.3mmx11.5mm的Arduino,见过吗?

a0939bd539c2e4ea2ebcbb31e6e8c35c.gif

本文来自个人微信公众号「ID:strongerHuang」,经原作者授权发布。原文公众号由嵌入式工程师「strongerHuang」在精心整理并维护。专注分享的内容包含:Keil、IAR、STM8、STM32、μC/OS、FreeRTOS、CANOpen、ModBus...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值