小端法(little endian),就是将最低有效字节放在前面
大端法(big endian),就是将最高有效字节放在前面
小端法违反直觉,但是主流操作系统都用这个,平时我们用的都是小端法
大端法符合习惯,用于网络字节流
需要澄清:
1. 具体字节是顺序排列还是倒序排列,是就一个具体的数据内部而言的。也就是说,数据与数据之间永远都是顺序存放,大端小端不会影响数据以外的内容(比如字符对齐产生的多余空间)
2. 字符串永远都是顺序存放,因此具有更好的跨平台性
实验1:
#include <stdio.h>
#include <netinet/in.h>
int main()
{
printf("little endian:\n");
short n = 0x1234;
for(int i = 0; i < sizeof(n); ++i){
printf("%x\n", *((char*)&n + i));
}
printf("big endian:\n");
n = htons(n); // 将一个小端表示的短整型转为大端表示
for(int i = 0; i < sizeof(n); ++i){
printf("%x\n", *((char*)&n + i));
}
return 0;
}
结果:
little endian:
34
12
big endian:
12
34
实验2:
#include <stdio.h>
#include <string.h>
struct node
{
short s;
int n;
} a;
int main()
{
printf("sizeof(node) = %d\n", sizeof(a));
memset(&a, 0, sizeof(a));
a.s = 0x0123;
a.n = 0x01234567;
for(int i = 0; i < sizeof(a); ++i){
printf("%02x\n", *((char*)&a+i));
}
return 0;
}
结果:
sizeof(node) = 8
23
01
00
00
67
45
23
01