1. 字节序基础概念解析
在计算机系统中,字节序(Endianness)指的是多字节数据在内存中的存储顺序。这个概念最早由计算机科学家Danny Cohen在1980年发表的论文《On Holy Wars and a Plea for Peace》中提出,他用《格列佛游记》中的大端派和小端派来比喻不同的字节序。
1.1 大端序与小端序的定义
大端序(Big-endian)将数据的最高有效字节(Most Significant Byte,MSB)存储在最低的内存地址处,而小端序(Little-endian)则相反,将最低有效字节(Least Significant Byte,LSB)存储在最低的内存地址处。
举个例子,假设我们要存储32位整数0x12345678(十六进制表示):
-
大端序存储:
地址:0x1000 0x1001 0x1002 0x1003
数据:0x12 0x34 0x56 0x78 -
小端序存储:
地址:0x1000 0x1001 0x1002 0x1003
数据:0x78 0x56 0x34 0x12
注意:字节序问题只存在于多字节数据类型(如short、int、long等)中,单字节数据(如char)不存在字节序问题。
1.2 常见处理器的字节序
不同的处理器架构采用不同的字节序:
- 大端序架构:PowerPC、SPARC、早期的Motorola 68000系列
- 小端序架构:x86、x86-64、ARM(通常可配置)
- 双端序架构:某些现代处理器(如ARM)支持通过配置选择字节序
在实际应用中,x86架构的普遍使用使得小端序成为主流,但在网络协议中,大端序(网络字节序)是标准。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. C语言中的字节序检测与转换
2.1 检测系统字节序的方法
在C语言中,我们可以通过简单的程序检测当前系统的字节序:
c复制#include <stdio.h>
int main() {
unsigned int num = 0x12345678;
unsigned char *p = (unsigned char *)#
if (*p == 0x78) {
printf("Little
