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

 
下面代码示范了两种检测系统字节序的方法。
第一种方法,使用强制类型转换的方式。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 *********************************************************/
13int 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 ********************************************************************************/
30int 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  
53int 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}

[图片] 运行截图

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值