通过数组判断大端小端


   
  char a[2];
  
*((unsigned short*)a)=1;
printf("%d %d\n",a[0],a[1]);

在电脑上输出的是 1 0 ,判定机器内存模式是小端,否则是大端,这样判定对吗?

c 操作系统

najunia 12 years, 8 months ago

你的方法是可以的,大小端的定义及存储情况如下:
大端模式(Big Endian):数据的低位保存在内存的高地址,数据的高位保存在内存的低地址
小端模式(Little Endian):数据的低位保存在内存的低地址,数据的高位保存在内存的高地址
例如:
1. 16bit宽的数0x1234(假设从地址0x4000开始存放)
在Little-endian模式CPU内存中的存放方式为:
内存地址 0x4000 0x4001
存放内容 0x34 0x12
而在Big-endian模式CPU内存中的存放方式则为:
内存地址 0x4000 0x4001
存放内容 0x12 0x34
2. 32bit宽的数0x12345678(假设从地址0x4000开始存放)
在Little-endian模式CPU内存中的存放方式为:
内存地址 0x4000 0x4001 0x4002 0x4003
存放内容 0x78 0x56 0x34 0x12
而在Big-endian模式CPU内存中的存放方式则为:
内存地址 0x4000 0x4001 0x4002 0x4003
存放内容 0x12 0x34 0x56 0x78
其实还可以通过union来判断大小端
联合体union的存放顺序是所有成员都从低地址开始存放,利用该特性,可轻松地获得了CPU对内存采用Little-endian还是Big-endian模式读写。
代码如下:

   
  int checkCPUisBigedian()
  
{
union w
{
int a;
char b;
} c;

c.a = 1;

return (c.b == 1);
}

快递大哥梨子 answered 12 years, 8 months ago

Your Answer