当前位置: 首页 > news >正文

大端存储(Big-Endian)和小端存储(Little-Endian)的区别

核心概念:内存地址与字节顺序

内存地址: 计算机内存被划分为连续的字节单元,每个单元都有一个唯一的地址。地址通常从低地址向高地址增长。
多字节数据: 像 int(通常4字节)、short(通常2字节)、long(通常4或8字节)、float(通常4字节)、double(通常8字节)这样的数据类型需要占用多个连续的内存字节。
字节顺序问题: 当一个多字节数据(例如一个32位的整数 0x12345678)需要存储到内存中时,它会被拆分成多个字节(这里是4个字节:0x12, 0x34, 0x56, 0x78)。这些字节以什么顺序排列在连续的内存地址中?这就是大端和小端的区别所在。
1. 大端存储 (Big-Endian)
定义: 最高有效字节 (Most Significant Byte - MSB) 存储在最低的内存地址上。后续字节按重要性递减的顺序依次存放在递增的地址上。

特点:

符合人类阅读习惯: 从左(低地址)到右(高地址)阅读内存内容,看到的字节顺序与书写该数值的常规顺序(高位在前)一致。
网络标准: TCP/IP协议族规定网络传输的数据使用大端字节序,因此也称为网络字节序 (Network Byte Order)。
举例 (存储 0x12345678 在地址 0x1000 开始的4个字节中):

内存地址 0x1000 (低地址) 0x1001 0x1002 0x1003 (高地址)
存储内容 0x12 (MSB) 0x34 0x56 0x78 (LSB)
从低地址 0x1000 开始读:0x12, 0x34, 0x56, 0x78 -> 直接就是 0x12345678。
2. 小端存储 (Little-Endian)

image

 

image

 


定义: 最低有效字节 (Least Significant Byte - LSB) 存储在最低的内存地址上。后续字节按重要性递增的顺序依次存放在递增的地址上。

特点:

符合CPU计算习惯: CPU进行数值运算(如加法)通常从最低位开始。小端存储允许CPU在读取数据时,直接从低地址开始读取低位字节进行计算,效率可能更高(尤其在早期硬件设计中)。
主流桌面/服务器CPU标准: x86, x86_64 (Intel, AMD) 架构的CPU普遍采用小端模式。ARM架构的CPU通常也默认小端,但可以配置为大端。
举例 (存储 0x12345678 在地址 0x1000 开始的4个字节中):

内存地址 0x1000 (低地址) 0x1001 0x1002 0x1003 (高地址)
存储内容 0x78 (LSB) 0x56 0x34 0x12 (MSB)
从低地址 0x1000 开始读:0x78, 0x56, 0x34, 0x12 -> 需要反过来组合才能得到原始值 0x12345678。
3. 核心区别图示
 

数值: 0x12345678 (32位整数)

大端 (Big-Endian):
地址增长方向: -------->
MSB --------------------> LSB
内存地址: 0x1000 0x1001 0x1002 0x1003
内容: 0x12 0x34 0x56 0x78

小端 (Little-Endian):
地址增长方向: -------->
LSB --------------------> MSB
内存地址: 0x1000 0x1001 0x1002 0x1003
内容: 0x78 0x56 0x34 0x12

4. 为什么会有两种字节序?哪个更好?
历史原因与设计选择: 不同的处理器架构在设计时选择了不同的字节序方案。早期不同的计算机厂商(如Motorola 68000系列用大端,Intel x86用小端)各自为政导致了分歧。
没有绝对优劣:
大端优势: 直观(内存转储即数值),网络传输标准。
小端优势: 对于CPU进行从低位开始的算术运算、类型转换(如 int 转 short 只需取低地址的2字节)可能更自然高效。
现状: 小端模式在个人电脑、服务器市场(x86/x64主导)占据绝对主流。大端模式在部分嵌入式系统、网络设备、某些老式大型机以及作为网络传输标准时使用。ARM架构通常是小端,但也支持大端模式(Bi-Endian)。
5. 字节序的重要性体现在哪里?
字节序问题主要在以下场景中变得至关重要:

网络通信: 当不同字节序的机器通过网络交换原始二进制数据(而不是文本)时,如果发送方不将数据转换为网络字节序(大端),接收方不将其转换回自己的主机字节序,接收到的数据就是错误的。
解决方案: 使用标准库函数 htonl(), htons() (Host TO Network Long/Short) 和 ntohl(), ntohs() (Network TO Host Long/Short) 进行转换。
读取二进制文件/数据流: 如果二进制文件是由不同字节序的机器生成的,读取时就需要进行字节序转换。例如,读取一个JPEG图片文件头(通常是大端)或分析网络抓包数据(大端)。
共享内存/直接内存访问: 如果两个共享内存的进程运行在不同字节序的CPU上,或者程序直接访问硬件设备(其字节序可能与CPU不同),直接读取内存中的多字节数据会出错。
反汇编/调试: 理解字节序对于查看内存内容和理解汇编指令操作数据的方式非常重要。
6. 如何检测系统的字节序?
这里提供一个简单的C程序示例:

#include <stdio.h>

int main() {
unsigned int value = 0x12345678; // 一个4字节的测试值
unsigned char *bytePtr = (unsigned char *)&value; // 指向该值首字节的指针

// 打印每个字节的内容和地址
for (int i = 0; i < sizeof(value); i++) {
printf("Address: %p, Value: 0x%02X\n", (void *)(bytePtr + i), *(bytePtr + i));
}

// 根据第一个字节的值判断
if (*bytePtr == 0x78) { // 如果最低地址存的是最低有效字节(0x78)
printf("This system uses Little-Endian.\n");
} else if (*bytePtr == 0x12) { // 如果最低地址存的是最高有效字节(0x12)
printf("This system uses Big-Endian.\n");
} else {
printf("Unexpected result. Might be mixed-endian? (Very rare)\n");
}

return 0;
}

运行结果解释
在小端系统上:
Address: 0x7ffc5a3b8a9c, Value: 0x78
Address: 0x7ffc5a3b8a9d, Value: 0x56
Address: 0x7ffc5a3b8a9e, Value: 0x34
Address: 0x7ffc5a3b8a9f, Value: 0x12
This system uses Little-Endian.

在大端系统上:
Address: 0x7ffc5a3b8a9c, Value: 0x12
Address: 0x7ffc5a3b8a9d, Value: 0x34
Address: 0x7ffc5a3b8a9e, Value: 0x56
Address: 0x7ffc5a3b8a9f, Value: 0x78
This system uses Big-Endian.

7. 总结
特性 大端存储 (Big-Endian) 小端存储 (Little-Endian)
最高有效字节 (MSB) 存储在最低内存地址 存储在最高内存地址
最低有效字节 (LSB) 存储在最高内存地址 存储在最低内存地址
内存顺序 数值高位 -> 低地址,数值低位 -> 高地址 数值低位 -> 低地址,数值高位 -> 高地址
直观性 高 (内存转储顺序即数值顺序) 低 (内存转储顺序是数值的逆序)
CPU运算亲和性 一般 可能更好 (从低位开始运算)
网络传输标准 是 (网络字节序) 否 (需转换为网络字节序)
常见架构 Motorola 68000, SPARC (传统), 网络传输, Java虚拟机 (内部) x86/x86_64, ARM (默认), DEC Alpha, VAX
别名 网络字节序 (Network Byte Order) 主机字节序 (Host Byte Order, 在主流系统上通常指小端)
关键点记住:

大端: 大哥(MSB)坐低位(低地址)。
小端: 小弟(LSB)坐低位(低地址)。
字节序问题只在多字节数据作为原始字节序列在不同系统间传输、存储或解释时才需要关注。处理文本、XML、JSON等格式本身不涉及字节序问题。
进行网络编程或处理跨平台二进制数据时,务必使用 htonl/htons/ntohl/ntohs 等函数进行字节序转换。
 
参考:https://blog.csdn.net/jppdss/article/details/148604228

https://blog.csdn.net/2401_89872625/article/details/145125646

 

http://www.jsqmd.com/news/17513/

相关文章:

  • 2025 年最新推荐!国内污水处理设备优质厂家排行榜,助力企业精准选靠谱设备
  • 基于OpenGL实现三维树木生长动画的解决方案
  • 如何实现文件批量重命名后再进行批量打包下载
  • shiyan 2
  • 曾国藩遗嘱 今将永别,特立四条以教汝兄弟。
  • 【IEEE出版】第五届测量控制与仪器仪表国际学术会议(MCAI 2025)
  • 2025年氢氧化镁厂家推荐排行榜,矿石氢氧化镁,水镁石氢氧化镁,阻燃剂氢氧化镁,改性氢氧化镁源头企业深度解析
  • ML-Summit2025|从游戏AI到工程机械,具身智能的实践与应用
  • 【数据结构】二叉树的高频热门面试题大全 - 指南
  • 2025年服装辅料厂家权威推荐榜:服饰辅料,全品类辅料,箱包辅料源头厂家精选,品质保障与创新设计深度解析
  • 为什么Redis的执行是原子性的,怎么保证原子性的
  • 逆向 | 逃离鸭科夫 frida hook 锁血
  • zedboard + AD-FMCOMMS3-EBZ AD9361 (六)gnuradio
  • CF2109D D/D/D
  • SpringBoot使用TraceId日志链路追踪
  • 马尔可夫决策过程的理解
  • 2025年试验机厂家权威推荐榜单:拉力试验机,江都试验机,管材环刚度试验机,电子万能试验机,橡胶试验机,压缩试验机及静刚度试验机精选
  • 2025 年球墨铸铁管厂家最新推荐榜:涵盖 K9/C 级供水等多规格,优质厂家选购指南 k9级球墨铸铁管/c25级球墨铸铁管/c30球墨铸铁管/c级球墨铸铁管厂家推荐
  • Cypress 插件实战:让你的测试不再“偶尔掉链子”
  • 2025年掘进机/综掘机厂家权威推荐榜:专业制造与技术实力深度解析,高效掘进设备优选指南
  • 洛谷P2474 [SCOI2008] 天平 题解
  • Telnet发送邮件
  • 一天一款实用的AI工具,第8期,AI转素描风格
  • 2025年预应力张拉设备厂家推荐排行榜,千斤顶,预应力千斤顶,预应力张拉千斤顶,预应力张拉机,锚具,预应力锚具,桥梁施工锚具公司精选
  • 完整教程:【C++】string类
  • 【ACM独立出版|EI稳定】第二届云计算与大数据国际学术会议(ICCBD 2025)
  • 机器学习周报十五 - 教程
  • 完整教程:【LeetCode 每日一题】2221. 数组的三角和
  • 软件设计中的需求分析——白日梦
  • 包装工位连接断开,终检产品无法进入包装