这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » CPU大小端之分

共18条 1/2 1 2 跳转至

CPU大小端之分

高工
2022-06-04 09:58:09     打赏
通信协议中数据传输、数组的存储方式、数据的强制转换等这些都会牵涉到大小端问题。


CPU的大端和小端模式很多地方都会用到,可能还是有很多读者没明白,今天就给大家普及一下。


1为什么会有大小端模式之分呢?

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


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


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


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



2什么是大端、小端?

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


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

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

image.png再结合一张图进行理解:

image.png


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

image.png



3数组在大端小端情况下的存储

以unsigned int value = 0x12345678为例,分别看看在两种字节序下其存储情况,我们可以用unsigned char buf[4]来表示value。


1.大端模式下

image.png2.小端模式下

image.png不知道大家平时有没有对数组进行强制转换成整型数据如果你要进行强制转换,肯定要考虑大小端问题。


4大小端谁更好?

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


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


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



5常见字节序

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


1.常见CPU的字节序

大端模式:PowerPC、IBM、Sun

小端模式:x86、DEC

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

2.STM32属于小端模式

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

image.png


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



6大小端转换

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


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


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))


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





关键词: 大端     小端    

专家
2022-06-04 11:34:50     打赏
2楼

参考和学习,很有用


专家
2022-06-04 11:43:13     打赏
3楼

学习


专家
2022-06-04 16:40:48     打赏
4楼

谢谢分享


高工
2022-06-04 16:50:31     打赏
5楼

感谢楼主的分享,很实用了。


院士
2022-06-04 17:43:19     打赏
6楼

谢谢分享


院士
2022-06-04 18:06:25     打赏
7楼

感谢分享


院士
2022-06-04 21:25:43     打赏
8楼

谢谢楼主的科普,学习了。


专家
2022-06-04 23:13:38     打赏
9楼

看看


专家
2022-06-04 23:28:34     打赏
10楼

感谢分享


共18条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]