免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1285 | 回复: 0

大端格式与小端格式 [复制链接]

论坛徽章:
0
发表于 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 。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP