试题 1 : 请写一个 C 函数,若处理器是 Big_endian 的,则返回 0 ;若是 Little_endian 的,则返回 1
解答:
int checkCPU( )
{
{
union w
{
int a;
char b;
} c;
c.a = 1;
return(c.b ==1);
}
}
剖析:
嵌入式系统开发者应该对 Little-endian 和 Big-endian 模式非常了解。采用 Little-endian 模式的 CPU 对操作数的存放方式是从低字节到高字节,而 Big-endian 模式对操作数的存放方式是从高字节到低字节。例如, 16bit 宽的数 0x1234 在 Little-endian 模式 CPU 内存中的存放方式(假设从地址 0x4000 开始存放)为:
内存地址 |
0x4000 |
0x4001 |
存放内容 |
0x34 |
0x12 |
而在 Big-endian 模式 CPU 内存中的存放方式则为:
内存地址 |
0x4000 |
0x4001 |
存放内容 |
0x12 |
0x34 |
32bit 宽的数 0x12345678 在 Little-endian 模式 CPU 内存中的存放方式(假设从地址 0x4000 开始存放)为:
内存地址 |
0x4000 |
0x4001 |
0x4002 |
0x4003 |
存放内容 |
0x78 |
0x56 |
0x34 |
0x12 |
而在 Big-endian 模式 CPU 内存中的存放方式则为:
内存地址 |
0x4000 |
0x4001 |
0x4002 |
0x4003 |
存放内容 |
0x12 |
0x34 |
0x56 |
0x78 |
联合体 union 的存放顺序是所有成员都从低地址开始存放,面试者的解答利用该特性,轻松地获得了 CPU 对内存采用 Little-endian 还是 Big-endian 模式读写。