1. 大小端字节序与内存存储探秘
第一次看到内存中的数据排列时,我完全懵了——为什么一个十六进制数0x11223344在内存中会变成44 33 22 11这样"倒着"存储?这背后其实隐藏着计算机系统设计中一个极其重要的概念:字节序。
1.1 大小端存储的本质区别
大小端(Endianness)本质上解决的是多字节数据在内存中的存放顺序问题。想象一下你要把"Hello"这个词写在几张卡片上,大端就像从左到右正常书写,而小端则像从右到左倒着写。
具体到技术实现:
- 大端模式:最高有效字节(MSB)存放在最低内存地址
c复制// 0x11223344 的存储方式(地址递增方向→) 地址: 0x1000 0x1001 0x1002 0x1003 数据: 0x11 0x22 0x33 0x44 - 小端模式:最低有效字节(LSB)存放在最低内存地址
c复制// 0x11223344 的存储方式(地址递增方向→) 地址: 0x1000 0x1001 0x1002 0x1003 数据: 0x44 0x33 0x22 0x11
关键理解:这里的"高/低"指的是数据位权值的高低,不是地址高低。比如0x11是最高字节因为它的位权是16^3,而0x44是最低字节。
1.2 实战中的字节序判断
在实际开发中,判断当前系统的字节序是个必备技能。下面这个经典方法我用了十几年:
c复制#include <stdio.h>
int check_endian() {
int num = 1;
// 取int的第一个字节
char* p = (char*)#
return *p == 1; // 返回1是小端,0是大端
}
int main() {
printf("当前系统是%s端\n",
check_endian() ? "小" : "大");
return 0;
}
这个方法的精妙之处在于:
- 定义int变量num=1,其二进制表示为00 00 00 01(十六进制0x00000001)
- 通过char指针访问第一个字节
- 小端系统会读到0x01,大端
