大端模式:高字节存放高地址
小端模式:高字节存放低地址
下面举个例子:
有int型数据0x12345678存放在地址0x00开始处,则大小端存放方法见下图
那么怎么验证系统是大端还是小端模式呢?
下面推荐两种方法:
1.用联合体来验证:
include <stdio.h>
int checknum()
{
union check
{
int i;
char ch;
}c;
c.i = 1;
return (c.ch == 1);
}
int main(int argc, char **argv)
{
int ret = checknum();
if(ret)
{
printf("little endian\n");
}
else
{
printf("big endian\n");
}
return 0;
}
2.用字节地址来判断:
#include <stdio.h>
typedef unsigned char BYTE;
int main(int argc, char **argv)
{
unsigned int num,*p;
p = #
num = 0;
*(BYTE*)p = 0xff;
if(num == 0xff)
{
printf("The endian of cpu is little\n");
}
else
{
printf("The endian of cpu is big\n");
}
return 0;
}
那么怎么实现大小端模式的转换呢?
其实这个很简单,只要进行.整数字节序转换就可以了。
//对应int32大小的成员 的转换 范例
int32_t swapInt32(int32_t value)
{
return ((value & 0x000000FF) << 24) |
((value & 0x0000FF00) << 8) |
((value & 0x00FF0000) >> 8) |
((value & 0xFF000000) >> 24) ;
}
后面的竖线是进行或运算,改成加号也可以。