int型数据给出的地址是数据的起始地址
内存地址从左向右,从上到下增大,左上方是低位地址
数据是从低位向高位存储的,所以数据的起始地址是低位地址
大小端的数据是以字节为单位判断的
1. 通过指针类型强制转换并对整型数据首字节赋值,判断该赋值赋给了高位还是低位
typedef unsigned char BYTE;
int main(int argc, char* argv[])
{
unsigned int num,*p;
p = #
num = 0;
*(BYTE *)p = 0xff;//给起始地址即低位地址赋值0xff
if(num == 0xff)//低位地址保存的是低位数据,所以是小端存储
{
printf("little\n");
}
else //num == 0xff000000,低位地址保存的是高位数据,所以是大端存储
{
printf("big\n");
}
return 0;
}
2. 我们知道,union 的成员本身就被存放在相同的内存空间(共享内存,正是union 发挥作用、做贡献的去处),因此,我们可以将一个CHAR/BYTE 数据和一个整型数据同时作为一个union 的成员,得出如下答案:
int checkCPU()
{
{
union w
{
int a;
char b;
} c;
c.a = 1;
return (c.b == 1);
}
}
3.实现同样的功能,我们来看看Linux 操作系统中相关的源代码是怎么做的:
static union { char c[4]; unsigned long mylong; } endian_test = {{ 'l', '?', '?', 'b' } };
#define ENDIANNESS ((char)endian_test.mylong) Linux 的内核作者们仅仅用一个union 变量和一个简单的宏定义就实现了一大段代码同样的功能!由以上一段代码我们可以深刻领会到Linux 源代码的精妙之处!(如果ENDIANNESS= 'l'表示系统为little endian,如果为 'b' 表示big endian )