字节顺序

概述

不同的机器有不同的字节顺序存储方法,一般分为小端法和大端法。
下面解释下小端法和大端法。

小端法:最低有效字节在最前面。
大端法:最高有效字节在最前面。

验证自己的电脑使用大端法还是小端法

下面这个程序可以验证你的电脑是使用大端法还是小端法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//Named ShowInt.c

#include <stdio.h>

typedef unsigned char *byte_pointer;

void show_bytes(byte_pointer start, size_t len);
void show_int(int x);

int main(void)
{
int x = 12345;
printf("%d = 0x%x\n",x,x);
show_int(x);
return 0;
}

void show_bytes(byte_pointer start, size_t len)
{
size_t i;
for(i = 0; i < len; i++){
printf(" %.2x",start[i]);
}
printf("\n");
}

void show_int(int x)
{
show_bytes((byte_pointer)&x, sizeof(int));
}

使用下面的命令编译,运行:

cc -g -o ShowInt ShowInt.c
./ShowInt

程序输出:

12345 = 0x3039
39 30 00 00

通常书写数字的时候最高有效位在左边,最低有效位在右边,拿上面例子来说,30是最高有效位,
但是实际情况是最低有效位39先输出,与通常书写数字顺序相反,说明我的这个电脑是小端法机器。

总结

可以在其它机器上做实验,最终会发现Linux 32,Windows,Linux 64是小端法机器,Sun是大端法机器。

延伸

有些机器是大端法,有些机器是小端法,那么它们在进行网络通信传输字节的时候,
因特网主机可以有不同的主机字节顺序,字节可能会出现反序的情况,为此TCP/IP为任意整数数据项
定义了统一的网络字节顺序 — 大端字节顺序。例如IP地址,它放在包头中跨过网络被携带。在IP地址
结构中存放的地址总是以(大端法)网络字节顺序存放的,即使主机字节顺序是小端法。