1. 数据在内存中的存储基础
计算机内存以字节为单位存储数据,但不同类型的数据(如整数、浮点数)在内存中的表示方式各不相同。理解数据在内存中的存储机制,是进行底层编程、性能优化和跨平台开发的基础。
内存存储涉及两个关键概念:字节序(大小端)和数值编码(原码、反码、补码)。字节序决定了多字节数据在内存中的排列顺序,而数值编码则定义了如何用二进制表示正负数。
提示:在C/C++等系统级编程中,直接操作内存时若忽略这些概念,可能导致难以察觉的bug。比如网络传输数据时若未统一字节序,接收端解析的数据将完全错误。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 大小端字节序详解
2.1 什么是大小端存储
大小端(Endianness)描述多字节数据在内存中的存储顺序。假设有一个32位整数0x12345678(十六进制表示),其在内存中的存储方式有两种:
-
大端模式(Big-endian):高位字节存储在低地址
code复制地址增长方向 → +----+----+----+----+ | 12 | 34 | 56 | 78 | +----+----+----+----+ -
小端模式(Little-endian):低位字节存储在高地址
code复制地址增长方向 → +----+----+----+----+ | 78 | 56 | 34 | 12 | +----+----+----+----+
2.2 大小端的现实影响
我在实际开发中遇到过这样一个案例:一个嵌入式设备(大端)通过网络向x86服务器(小端)发送数据时,直接传输了内存中的二进制数据,导致服务器解析出的数值完全错误。解决方案是在传输前统一转换为网络字节序(大端):
c复制// 主机序转网络序(大端)
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
// 网络序转主机序
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
2.3 判断当前系统的字节序
通过简单的C代码即可检测系统字节序:
c复制#include <stdio
