大小端(Endianness)本质是多字节数据在内存中的存储顺序规则,因硬件架构差异产生,直接影响数据跨设备 / 跨平台的正确性。
定义及其意义
- 核心定义
大端(Big-Endian):高位字节存低地址。内存地址从低到高(符合人类阅读习惯,先读高位)。
小端(Little-Endian):低位字节存低地址。内存地址从低到高(更符合 CPU 底层运算逻辑,效率更高)。 - 大小端的实际意义
跨设备数据传输:网络传输默认用大端(网络字节序),而 PC(x86/x86_64)、手机(多数 ARM)默认是小端,若不转换会导致数据解析错误(如把 0x1234 读成 0x3412)。
硬件兼容性:不同 CPU 架构端序不同(如 PowerPC、早期 ARM 支持大端,x86 仅支持小端),底层编程(驱动、嵌入式)必须匹配硬件端序,否则操作寄存器 / 二进制文件会出错
那该如何判断自己的设备是大端还是小段呢?下面给出联合体法
判断方法:
方法原理:联合体的所有成员共享同一块内存
#include <stdio.h>
// 定义联合体:int和char数组共享4字节内存
union EndianTest {
int num; // 4字节数据,用于存储测试值
char byte[4]; // 1字节数组,用于访问首地址的字节
};
int main() {
union EndianTest test;
test.num = 0x12345678; // 测试数据:高位字节0x12,低位字节0x78
// 访问首地址(byte[0]对应int的最低内存地址)
if (test.byte[0] == 0x78) {
printf("当前设备是【小端】\n");
} else if (test.byte[0] == 0x12) {
printf("当前设备是【大端】\n");
} else {
printf("无法判断(极少出现)\n");
}
return 0;
}
这样就可以判断自己的设备是大端or小端了

754

被折叠的 条评论
为什么被折叠?



