字节序和大小端

 大多数处理器中内存是可以以字节为单位进行寻址的,当数据类型(int, long)大于1个字节时,其所占用就的字节在内存中的顺序存在两种模式,分别是小端模式(little endian)和大端模式(big endian)。小端模式低位字节存放在低地址,大端模式高位字节存放在低地址。

 

        在一个32位处理器上,一个类型为int的endian_id变量占用4个字节。假设endian_id位于0x10000内存地址处,则小端模式的处理器上其个字节如下图所示:

小端模式

 

大端模式的处理器上各字节如下图所示:

大端模式

图中的LSB是指最低有效位(Little Significant Bit),MSB是指最高有效位(Most Significant Bit)。

        

        下面用一个示例程序来展示字节序在编程中的重要性。如果在小端模式的处理器上该运行程序会输出正确的运行结果,在大端模式的处理器上将输出错误的结果。

demo

如上图我是在Linux系统里面运行得到的结果(Linux是小端模式)。

 

        下面分析一下为什么同一个程序在不同字节序的处理器上运行的结果为什么会不一样,下图是说明了在小端模式下main()调用foo()时module_id变量中值得变化过程。注意,foo()函数的参数是以指针的形式传递的,所以在main()中module_id变量的起始地址如果是0x10000,那么传入到foo()函数后_p_module_id变量指向的地址也是0x10000。

从上图中可以看到,小端模式下并不存在问题,这与示例程序是相吻合的。下面我们在展示一下在大端模式的处理器中运行的情形,从图中了解为什么会出现问题

从这个示例程序中我们可以看出,由于处理器两种字节序的存在,如果指针的传递类型不匹配,有可能导致运行的结果出错,因此在软件开发过程中指针应当严格按照所需类型进行传递。

更多的精彩内容请关注微信公众号“Linux嵌入式

### 字节序的概念 字节序是指多字节数在计算机内存中的存储顺序。对于一个多字节的数据类型(如整型、浮点型等),其各个字节可能按照不同的顺序被存储到内存中。这种存储方式主要分为两大类:大端字节序(Big-Endian)小端字节序(Little-Endina)。 #### 大端字节序 大端字节序是一种将数据的高位字节存储在低地址,而低位字节存储在高地址的方式。这种方式与人们日常书写的数字顺序一致,因此更容易被人理解。例如,假设有一个32位无符号整数 `0x12345678` 需要存储在一个按字节寻址的内存中: | 地址 | 值 | |------|-------| | 0x00 | 0x12 | | 0x01 | 0x34 | | 0x02 | 0x56 | | 0x03 | 0x78 | 在这个例子中,最高有效字节 `0x12` 被放置在最低地址位置 `0x00` 上,这正是大端字节序的特点[^1]。 #### 小端字节序 相比之下,小端字节序则采用了一种完全相反的方式来处理相同的情况——它会把数据的低位字节存放到较低的内存地址上,而高位字节则存放在较高的内存地址上。继续以上述相同的数值为例,在小端字节序下的存储情况如下所示: | 地址 | 值 | |------|-------| | 0x00 | 0x78 | | 0x01 | 0x56 | | 0x02 | 0x34 | | 0x03 | 0x12 | 可以看到,这里最显著的变化在于最低有效字节 `0x78` 已经移动到了起始地址 `0x00` 的地方[^2]。 #### 应用场景差异 不同架构的处理器可能会偏好使用其中一种特定类型的字节序作为默认设置。比如网络协议栈通常遵循的是基于TCP/IP标准的大端格式;然而像Intel x86系列微处理器家族内部操作则是依据于小端结构来执行指令集运算过程][^[^34]。 ```python def check_endianess(): num = 1 if isinstance(num, int): byte_array = bytearray((num).to_bytes(2, 'little')) return "Little Endian" if byte_array[0]==1 else "Big Endian" print(check_endianess()) ``` 上述Python脚本可以用来检测当前运行环境所支持的主要字节序列类型。如果返回值为 `"Little Endian"` 则说明该平台是以小端为主导;反之若是 `"Big Endian"` 表明此系统倾向于运用大端编码方案来进行二进制资料管理活动。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值