假定有两字节变量: short a=0x52AE,字节序讨论的就是某个包含多字节的基本类型(单元)中,字节的存放顺序
那么,字节序要确定的就是 short 型中,两个字节的存放顺序:
低字节放在低地址就是,小端序
高字节放在低地址就是,**大端序 **
1、小端方式存储
地址增大方向 --------->
0x0000 0x0001 0x0002 ... 0xFFFF
+--------+--------+--------+...+--------+
| AE | 52 | \ |...| \ |
+--------+--------+--------+...+--------+
||
||
\/
+--------+--------+--------+...+--------+
|10101110|01010010| \ |...| \ |
+--------+--------+--------+...+--------+
Note:图片格式 bmp,音频格式 wav 等内部数据存储使用的都是小端序
2、大端方式存储
地址增大方向 --------->
0x0000 0x0001 0x0002 ... 0xFFFF
+--------+--------+--------+...+--------+
| 52 | AE | \ |...| \ |
+--------+--------+--------+...+--------+
||
||
\/
+--------+--------+--------+...+--------+
|01010010|10101110| \ |...| \ |
+--------+--------+--------+...+--------+
Note: 网络字节序就是使用大端序。因此再像 socket 写入数据时,需要将数据调整为大端序
字节序影响只单元(如基本数据类型 Integer)内字节的存放顺序,而单元间的顺序不受影响
一个判断字节序的 c 程序:
#include <stdio.h>
int main(int argc, char **argv) {
union {
short s;
char c[sizeof(short)];
}un;
un.s = 0x0102;
if (sizeof(short) == 2) {
if (un.c[0] == 1 && un.c[1] == 2)
printf("big-endian\n");
else if (un.c[0] == 2 && un.c[1] == 1)
printf("little-endian\n");
else
printf("unknown\n");
}
else {
printf("sizeof(short) = %d\n", sizeof(short));
}
}