您的位置:首页 > 编程语言 > C语言/C++

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

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

void JudgeEndianness(void)
{
union
{
int x;
char x0;
}u={.x=0x11223344};     //初始化联合体中的成员整形数据x

if(u.x0 == 0x11)  printf("小端模式");//低地址存放低字节
if(u.x0 == 0x44)  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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息