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

下面代码示范了两种检测系统字节序的方法。

第一种方法,使用强制类型转换的方式。C 语言在把占用2个字节的 short 变量强制转换为 char 之后,会把 short 变量的首地址赋给 char 变量,可以根据 char 变量的值判断系统字节序是 大端 还是 小端。

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

测试环境:
      ubuntu 10.04 amd 64.

标签: 字节序  endian  Ubuntu

代码片段(2)[全屏查看所有代码]

1. [代码]endian.c     跳至 [1] [全屏预览]

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 }

2. [图片] 运行截图    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值