Chinaunix

标题: 大端格式与小端格式 [打印本页]

作者: 林生2010    时间: 2011-12-22 08:51
标题: 大端格式与小端格式
不同的CPU有不同的字节序类型,这些节序是指整数在内存中保存的顺序。
最常见的有两种:
1. Little-endian(小端):将低序字节存储在起始地址(低位编址)
2. Big-endian(大端):将高序字节存储在起始地址(高位编址)

检查CPU的大小端模式的代码如下:
#include <stdio.h>
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 <stdio.h>
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 。





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2