//小端字节序:低字节在低地址中,高字节在高地址中。这种字节序又称为主机字节序,intel的cpu使用的就是这种字节序。
//大端字节序:低字节在高地址中,高字节在低地址中。这种字节序又称为网络字节序,socket传输时就需要使用这种字节序。
#include <stdio.h>
#include <endian.h>
int main() {
if (__BYTE_ORDER == __LITTLE_ENDIAN) {
printf("little endian!\n");
} else if (__BYTE_ORDER == __BIG_ENDIAN) {
printf("big endian!\n");
} else {
printf("unknown endian!\n");
}
return 0;
}
下面代码示范了两种检测系统字节序的方法。
第一种方法,使用强制类型转换的方式。C 语言在把占用2个字节的 short 变量强制转换为 char 之后,会把 short 变量的首地址赋给 char 变量,可以根据 char 变量的值判断系统字节序是 大端 还是 小端。
第二种方法,利用 联合类型 的特性。联合类型 共享同一段内存,首地址是相同的。
/*******************
* 文件名:endian.c
******************/
#include <stdio.h>
/*********************************************************
* 使用类型的强制转换实现little-endian与big-endian的判断
*********************************************************
* 返回值:
* 1 表示是小端字节序。
* 0 表示不是小端字节序。
*********************************************************/
int
is_little_endian_a(
void
)
{
unsigned
short
flag = 0x4321;
if
(*(unsigned
char
*)&flag == 0x21)
return
1;
else
return
0;
}
/*********************************************************************************
* 利用联合的特点来判断little-endian与big-endian
*********************************************************************************
* 返回值:
* 1 表示是小端字节序。
* 0 表示是大端字节序。
* -1 表示不能使用这种方法确定字节序。比如有的机器的 short 长度不是 2 。
********************************************************************************/
int
is_little_endian_b(
void
)
{
union
endian_un{
short
var;
char
bits[
sizeof
(
short
)];
};
union
endian_un flag;
flag.var=0x0102;
//判断低位和高位的存储内容,确定是何种方式
if
(
sizeof
(
short
) == 2){
if
(flag.bits[0] == 1 && flag.bits[1] == 2)
return
0;
else
if
(flag.bits[0] == 2 && flag.bits[1] == 1)
return
1;
else
return
-1;
}
return
-1;
}
int
main(
void
)
{
int
type = 0;
type = is_little_endian_a();
if
(1 == type)
printf
(
"judged by first method, little-endian\n"
);
else
if
(0 == type)
printf
(
"judged by first method, big-endian\n"
);
type = is_little_endian_b();
if
(1 == type)
printf
(
"judged by second method, little-endian\n"
);
else
if
(0 == type)
printf
(
"judged by second method, big-endian\n"
);
else
printf
(
"can't judge it\n"
);
return
0;
}