天天看点

【C语言】[其他]:函数判断大端模式还是小端模式

利用大小端·模式数据存放的顺序不同以及联合体的特殊内存分配来实现。判断函数如下:

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

继续阅读