当前位置: 首页 > 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.zskr.cn/news/25322.html

相关文章:

  • Debian13.1.0最新镜像迅雷下载
  • 【数据结构】二叉树的高频热门面试题大全 - 指南
  • 2025年服装辅料厂家权威推荐榜:服饰辅料,全品类辅料,箱包辅料源头厂家精选,品质保障与创新设计深度解析
  • SpringBoot使用TraceId日志链路追踪
  • 马尔可夫决策过程的理解
  • Cypress 插件实战:让你的测试不再“偶尔掉链子”
  • 洛谷P2474 [SCOI2008] 天平 题解
  • 2025年实验室/手术室净化工程厂家推荐排行榜:涵盖无尘车间装修、洁净室建设、医院净化工程等全方位解决方案精选
  • 详细介绍:网络安全防御指南:全方位抵御暴力破解攻击
  • 2025年苹果仓厂家权威推荐榜单:苹果仓民宿,移动房苹果仓,出口苹果仓,外贸出口苹果仓,集装箱苹果仓,景区苹果仓,苹果仓房屋,网红苹果仓,可移动式苹果仓公司推荐
  • 多轮对话中,如何判断前后两次提问是否存在依赖关系
  • 基于SpringBoot的课程信息管理系统设计与实现 - 实践
  • 机器学习可扩展性:从1到百万用户的架构演进
  • 2025年保洁公司推荐排行榜,驻场保洁/钟点保洁/开荒保洁/外包保洁/商场保洁/办公楼保洁/工厂保洁/医院保洁/企业保洁服务优选指南
  • macOS 内核路由表执行:直接 API 编程指南
  • 2025年扑灭司林厂家推荐排行榜,高效环保杀虫剂,农业/卫生防疫专用扑灭司林原药及制剂公司推荐
  • 单细胞转录组:差异基因分析和富集分析 - 教程
  • DBA必备脚本:Oracle获取绑定变量的字面SQL文本版版本替代
  • 083_尚硅谷_多分支基本使用
  • 为什么制造业的仓库经验,放到电商就行不通?
  • Oracle案例:grid环境关于asm diskpath是否需要一致
  • 2025年10月洗碗机品牌推荐:海信领衔五大机型对比评测榜。
  • 微信消息管理桌面提醒版:桌面提醒与AI回复的完美结合
  • 2025 年片材机生产厂家最新推荐榜,技术实力与市场口碑深度解析多层共挤/流延/PC/pp 片材机公司推荐
  • 深入解析:【面试前必看:Redis 从入门到实战:核心知识与面试高频考点全解析】
  • 4-8〔O҉S҉C҉P҉ ◈ 研记〕❘ WEB应用攻击▸命令注入漏洞 - 实践
  • 2025年项目管理工具生态全景:技术主权与AI赋能的行业变革
  • winform连接锐浪GridReport打印示例
  • AI 的能源危机:训练一个模型究竟要耗掉多少电?
  • 2025 年制砂机厂家最新推荐榜,聚焦企业技术实力与市场口碑深度解析高效/冲击式/砂石/新疆制砂机厂家推荐