Chinaunix首页 | 论坛 | 博客
  • 博客访问: 280395
  • 博文数量: 42
  • 博客积分: 590
  • 博客等级: 中士
  • 技术积分: 447
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-04 01:15
个人简介

健康快乐 虚怀若谷 淡定从容

文章分类

全部博文(42)

分类: 嵌入式

2011-08-16 17:53:37

不同的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 。
阅读(2557) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~