利用大小端·模式数据存放的顺序不同以及联合体的特殊内存分配来实现。判断函数如下:
void JudgeEndianness(void)
{
union
{
int x;
char x0;
}u={.x=}; //初始化联合体中的成员整形数据x
if(u.x0 == ) printf("小端模式");//低地址存放低字节
if(u.x0 == ) printf("大端模式");//低地址存放高字节
}
大端模式:内存的低地址存放数据的高字节
小端模式:内存的低地址存放数据的低字节
以上面的函数为例:
x = 0x11223344;
1)假设x的首地址是0xFFFF FFF1,也就是存放x的内存的起始地址;那么存放四个数据,地址由低到高分别为:
0xFFFF FFF1、 0xFFFF FFF2、 0xFFFF FFF3、 0xFFFF FFF4;
第一个就是最低的内存地址了:0xFFFF FFF1;
3)假设在大端模式下:低地址存放高字节
最低内存地址:0xFFFF FFF1
最高数据字节:0x11
具体存储如下:
0xFFFF FFF1:0x11
0xFFFF FFF2:0x22
0xFFFF FFF3:0x33
0xFFFF FFF4:0x44
4)假设在小端模式下:低地址存放低字节
最低内存地址:0xFFFF FFF1
最低数据字节:0x44
具体存储如下:
0xFFFF FFF1:0x44
0xFFFF FFF2:0x33
0xFFFF FFF3:0x22
0xFFFF FFF4:0x11
5)再根据联合体数据类型的特点:联合体里的成员内存是共享的或者说是覆盖的,并且数据内存存储的长度就是存储最长的内部成员的长度。以上函数中的u.x0是char类型的,只占一个字节,并且u.x0的内容是联合体u的最低内存地址的里的内容。根据大小端模式的不同而不同,从而可以判断大小端模式。
P.S:一般X86的是小端模式
2015.4.2 00:23
pillarpeng