下面代码示范了两种检测系统字节序的方法。
第一种方法,使用强制类型转换的方式。C 语言在把占用2个字节的 short 变量强制转换为 char 之后,会把 short 变量的首地址赋给 char 变量,可以根据 char 变量的值判断系统字节序是 大端 还是 小端。
第二种方法,利用 联合类型 的特性。联合类型 共享同一段内存,首地址是相同的。
测试环境:
ubuntu 10.04 amd 64.
第一种方法,使用强制类型转换的方式。C 语言在把占用2个字节的 short 变量强制转换为 char 之后,会把 short 变量的首地址赋给 char 变量,可以根据 char 变量的值判断系统字节序是 大端 还是 小端。
第二种方法,利用 联合类型 的特性。联合类型 共享同一段内存,首地址是相同的。
测试环境:
ubuntu 10.04 amd 64.
代码片段(2)
[代码] endian.c
01 | /******************* |
02 | * 文件名:endian.c |
03 | ******************/ |
04 | #include <stdio.h> |
05 | |
06 | /********************************************************* |
07 | * 使用类型的强制转换实现little-endian与big-endian的判断 |
08 | ********************************************************* |
09 | * 返回值: |
10 | * 1 表示是小端字节序。 |
11 | * 0 表示不是小端字节序。 |
12 | *********************************************************/ |
13 | int is_little_endian_a( void ) |
14 | { |
15 | unsigned short flag = 0x4321; |
16 | if (*(unsigned char *)&flag == 0x21) |
17 | return 1; |
18 | else |
19 | return 0; |
20 | } |
21 | |
22 | /********************************************************************************* |
23 | * 利用联合的特点来判断little-endian与big-endian |
24 | ********************************************************************************* |
25 | * 返回值: |
26 | * 1 表示是小端字节序。 |
27 | * 0 表示是大端字节序。 |
28 | * -1 表示不能使用这种方法确定字节序。比如有的机器的 short 长度不是 2 。 |
29 | ********************************************************************************/ |
30 | int is_little_endian_b( void ) |
31 | { |
32 | union endian_un{ |
33 | short var; |
34 | char bits[ sizeof ( short )]; |
35 | }; |
36 | |
37 | union endian_un flag; |
38 | flag.var=0x0102; |
39 | |
40 | //判断低位和高位的存储内容,确定是何种方式 |
41 | if ( sizeof ( short ) == 2){ |
42 | if (flag.bits[0] == 1 && flag.bits[1] == 2) |
43 | return 0; |
44 | else if (flag.bits[0] == 2 && flag.bits[1] == 1) |
45 | return 1; |
46 | else |
47 | return -1; |
48 | } |
49 | |
50 | return -1; |
51 | } |
52 | |
53 | int main( void ) |
54 | { |
55 | int type = 0; |
56 | |
57 | type = is_little_endian_a(); |
58 | if (1 == type) |
59 | printf ( "judged by first method, little-endian\n" ); |
60 | else if (0 == type) |
61 | printf ( "judged by first method, big-endian\n" ); |
62 | |
63 | type = is_little_endian_b(); |
64 | if (1 == type) |
65 | printf ( "judged by second method, little-endian\n" ); |
66 | else if (0 == type) |
67 | printf ( "judged by second method, big-endian\n" ); |
68 | else |
69 | printf ( "can't judge it\n" ); |
70 | |
71 | return 0; |
72 | } |