大小端问题是面试常考的题目,所以有必要总结一下。
1.什么是大小端?
小端:低位字节数据存储在低地址。
大端:高位字节数据存储在低地址。
for exemple:
int a=0x12345678;(a首地址为0x2000)
0x2000 0x2001 0x2002 0x2003
0x12 0x34 0x56 0x78 大端格式
0x2000 0x2001 0x2002 0x2003
0x78 0x56 0x34 0x12 小端格式
2.判断大小端(代码实现)?
方法一:
void checkCpuMode(void)
{
int i = 0x12345678;
char *cp = (char *)&i; //取低地址
if(*cp == 0x78)
printf("little endian");
else
printf("big endian\n");
}
方法二:
void checkCpuMode(void)
{
int a = 0x12345678;
if((char)a == 0x12) //取低地址
printf("big endian\n");
else
printf("little endian\n");
}
3.大小端问题出现的场景?
不同的cpu处理内存数据的方式不同,以及cpu和网络处理数据的方式也可能不同,所以要指明大端还是小端。尤其是在做跨平台的项目的时候 。大小端问题通常出现在网络编程中,例如:网络字节序是和大端系统一致。也就是网络上传输任何数据的时候,采用大端系统一致的存放方法。而通常pc架构貌似都是小端。
4.大小端转换宏?
#define swp16(x) ((((short)(x) & (short)0x00ff) << 8) | (((short)(x) & (short)0xff00) >> 8))
#define Swap32(A) ( (((uint32)(A) & (0xff000000)) >> 24) | (((uint32)(A) & (0x00ff0000)) >> 8) | (((uint32)(A) & (0x0000ff00)) << 8) | (((uint32)(A) & (0x000000ff)) << 24) )