两种检测系统字节序的方法。

来源:互联网 发布:linux建立文件命令 编辑:程序博客网 时间:2024/06/07 19:15
 
下面代码示范了两种检测系统字节序的方法。
第一种方法,使用强制类型转换的方式。C 语言在把占用2个字节的 short 变量强制转换为 char 之后,会把 short 变量的首地址赋给 char 变量,可以根据 char 变量的值判断系统字节序是 大端 还是 小端。

第二种方法,利用 联合类型 的特性。联合类型 共享同一段内存,首地址是相同的。

测试环境:
      ubuntu 10.04 amd 64.

标签: 字节序 endianUbuntu

代码片段(2)

[代码] endian.c

view source
print?
01/*******************
02 * 文件名:endian.c
03 ******************/
04#include <stdio.h>
05  
06/*********************************************************
07 * 使用类型的强制转换实现little-endian与big-endian的判断 
08 *********************************************************
09 * 返回值:                                              
10 *          1 表示是小端字节序。                         
11 *          0 表示不是小端字节序。                       
12 *********************************************************/
13int is_little_endian_a(void)
14
15    unsignedshort flag = 0x4321;
16    if(*(unsignedchar*)&flag == 0x21)
17        return1;
18    else
19        return0;
20}
21  
22/*********************************************************************************
23 * 利用联合的特点来判断little-endian与big-endian
24 *********************************************************************************
25 * 返回值: 
26 *          1   表示是小端字节序。
27 *          0   表示是大端字节序。
28 *          -1  表示不能使用这种方法确定字节序。比如有的机器的 short 长度不是 2 。
29 ********************************************************************************/
30int is_little_endian_b(void)
31{
32    unionendian_un{
33        shortvar;
34        charbits[sizeof(short)];
35    };
36  
37    unionendian_un flag;
38    flag.var=0x0102;
39  
40    //判断低位和高位的存储内容,确定是何种方式
41    if(sizeof(short) == 2){
42        if(flag.bits[0] == 1 && flag.bits[1] == 2)
43            return0;
44        elseif(flag.bits[0] == 2 && flag.bits[1] == 1)
45            return1;
46        else
47            return-1;
48    
49      
50    return-1;
51}
52  
53int main(void)
54{
55    inttype = 0;
56  
57    type = is_little_endian_a();
58    if(1 == type)
59        printf("judged by first method, little-endian\n");
60    elseif (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    elseif (0 == type)
67        printf("judged by second method, big-endian\n");
68    else
69        printf("can't judge it\n");
70  
71    return0;
72}

[图片] 运行截图

转载自:http://www.oschina.net/code/snippet_10896_1306
 
原创粉丝点击