不同的CPU有不同的字节序类型,这些节序是指整数在内存中保存的顺序。
最常见的有两种:
1. Little-endian(小端):将低序字节存储在起始地址(低位编址)
2. Big-endian(大端):将高序字节存储在起始地址(高位编址)
检查CPU的大小端模式的代码如下:
#include
int checkCPU(void)
{
unsigned char *p;
unsigned char i;
int a;
a = 0x0100;
p = &a;
i = *p;
printf("the low address is %d \n",i);
p += 1;
i = *p;
printf("the high address is %d \n", i);
return(1);
}
int main(void)
{
int k;
k = checkCPU();
// printf("%d \n", k);
return 1;
}
例如,英特尔CPU采用小端模式,
运行结果如下:
#include
int main()
{
int a[5]={1,2,3,4,5};
int *ptr1=(int *)(&a+1);
int *ptr2=(int *)((int)a+1);
printf("%d,%d,%d,%d",a,a+1,ptr1-1,ptr2);
return 0;
}
例如,英特尔CPU采用小端模式,
运行结果又是什么呢?
关键是要弄清楚ptr1和prt2分别指向的地址是什么:
prt1 --> &a+1,其中&a是指数组a的地址,&a+1就是数组a的首地址向后增加5个int型的地址,即 prt1 = a + 5*4 ---> prt1 = a+20,而prt1也是指向整型数据,因此,可以得出prt1[-1] = prt1 - 1 = a[4] = 0x05;
prt2 --> (int)a + 1, 其中(int)a即是数组a的首地址的值,(int)a + 1就是a的真实值+1, 即为a[0]所占空间的第二个字节对应的地址, 而prt2也是指向整型数据,因此,可以得出*prt2就是a[0]的后三个字节与a[1]的第一个字节拼接起来的数据。a[0]的存储形式为:0x01 0x00 0x00 0x00 ; a[1]的存储形式为0x02 0x00 0x00 0x00, 所以*prt2 = 0x02000000 。