免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 994 | 回复: 0
打印 上一主题 下一主题

判断CPU的存储方式之大端、小端 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-16 14:09 |只看该作者 |倒序浏览

采用Little-endian模式(或者说是低位存储法)的CPU对操作数的存放方式是从低字节到高字节,
而Big-endian模式(或者说是高位存储法)对操作数的存放方式是从高字节到低字节。32bit宽的数0x12345678在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
内存地址
0x4000
0x4001
0x4002
0x4003
存放内容
0x78
0x56
0x34
0x12
而在Big-endian模式CPU内存中的存放方式则为:
内存地址
0x4000
0x4001
0x4002
0x4003
存放内容
0x12
0x34
0x56
0x78

联合体union的存放顺序是所有成员都从低地址开始存放的。
下面是判断大端和小端的一个程序(来自:
http://hi.baidu.com/spbeijilang/blog/item/97dc5b2af0b77093023bf61a.html

#include
int checkCPU();
main()
{
  int j;
  j=checkCPU();
  printf("j=%d\n",j);
}
int checkCPU( )
{
        union w
  {   
             int a;
             char b;  
        } c;
        c.a = 1;
        return(c.b == 1);
}
在visual C++(intel Celeron(R)cpu 2.80)上的输出为:j=1

在C语言参考手册的第六章6.1.2节中提供了一个移植性更好的测试程序:
(稍有改动)
#include
int main( )
{
        union w
  {   
             int a;
             char b[sizeof(int)];  
        } c;
        c.a = 1;
  if(c.b[0] == 1)
   printf("the addressing is little-endian\n");
  else if(c.b[sizeof(int)-1] == 1)
   printf("the addressing is big-endian\n");
  return 0;
}




本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/69832/showart_1931173.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP