转自:http://my.oschina.net/renhc/blog/37130
大端:多字节值的大端存储在该值的起始位置;(老大站排头为大)
小端:多字节值的小端存储在该值的起始位置;(老小站排头为小)
例如16bit整数:0x0102,其中01即为多字节值的大端,02即为多字节值的小端。
在网络中传输的都是大端序,但具体到某台主机CPU的实现,则有可能是大端序也可能是小端序。一般X86是小端。
那么,如何通过程序来判断当前主机到底是大端还是小端呢?
01 | /*判断大端还是小端, 1:小端 0:大端*/ |
02 | int GetEndian() |
03 | { |
04 | union |
05 | { |
06 | int a; |
07 | char b; |
08 | } s; |
09 | s.a = 0x0001; |
10 | return (1 == s.b); |
11 | } |
联合体union的存放顺序是所有成员都从低地址开始存放,给s.a赋值为0x01,00为a的高端,01为a的低端,如果b==1,即a的低端位于起始位置,即小端,反之为大端。
我觉得《UNIX网络编程》(第一卷)给的例子更严密一些:
01 | /*判断大端还是小端, 1:小端 0:大端*/ |
02 | int GetEndian() |
03 | { |
04 | union |
05 | { |
06 | short s; |
07 | char c[ sizeof ( short )]; |
08 | }un; |
09 |
10 | un.s = 0x0102; |
11 |
12 | if (2 == sizeof ( short )) |
13 | { |
14 | if (1 == un.c[0] && 2 == un.c[1]) |
15 | { |
16 | printf ( "big-endian\n" ); |
17 | return 0; |
18 | } |
19 | else if (2 == un.c[0] && 1 == un.c[1]) |
20 | { |
21 | printf ( "little-endian\n" ); |
22 | return 1; |
23 | } |
24 | else |
25 | { |
26 | printf ( "unknown\n" ); |
27 | } |
28 | } |
29 | else |
30 | { |
31 | printf ( "sizeof(short) = %d\n" , sizeof ( short )); |
32 | } |
33 |
34 | return 0; |
35 | } |