对于数据0x12345678
高字节为12
低字节为78
对于CPU来说:
小端模式,先取低字节数据,然后依次放入内存中
比如:
先取0x78放于第一个内存0x00,
再取0x56放于内存0x01
取0x34放于内存0x02
取0x12放于内存0x03
大端模式,先取高字节数据,然后依次放入内存中
比如:
先取0x12放于第一个内存0x00,
再取0x34放于内存0x01
再取0x56放于内存0x02
再取0x78放于内存0x03
这里有两点需要说明:
1.大小端只是影响CPU取字节的顺序,先取高字节(大端)或者先取低字节(小端),与内存无关。
2.内存是顺序分配,不管是大端模式还是小端模式,CPU取的第一个字节,放于内存0x00,第二个字节放于0x01,依次往后。
对于char 一个字节的数据,放于内存0x00。因为内存是顺序存放的。先分配0x00内存,再分配0x01内存。依次分配使用。
明白了这两点,我们就好理解测试CPU大小端模式的测试代码了:
1.测试代码一
int CheckCPU()
{
union w
{
int i;
char c;
}b;
b.i = 1;
if(b.c == 1)
{
printf("Little Endian!\r\n");
}
else
{
printf("Big Endian");
}
return (b.c == 1);/*return 1:Little Endian; return 0: Big Endian*/
}
解析:
对于小端模式,b.i = 0x00000001,取低字节0x01放于第一个内存0x00,然后依次往后。
分配内存: 0x00,0x01,0x02,0x03
所放数据为: 01 , 00, 00, 00
对于大端模式,b.i = 0x00000001,取高字节0x00,放于第一个内存0x00,然后依次往后。
分配内存: 0x00,0x01,0x02,0x03
所放数据为: 00, 00, 00, 01
由于联合体int i 与char c共享内存,所以char c存放于内存0x00。
所以如果b.c == 1 (即内存0x00处存放如果数据为01),则是小端模式,否则为大端模式。
2.测试代码二
int CheckCPU(void)
{
int i = 1;
char *c = (char *)&i;
if(*c == 1)
{
printf("Little Endian!\r\n");
}
else
{
printf("Big Endian");
}
return (*c == 1);/*return 1:Little Endian; return 0: Big Endian*/
}
原理与上相同,只是实现方式不同而已。