判断CPU的存储方式之大端、小端
时间:2009-05-16 来源:hubo214
采用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 <stdio.h>
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 <stdio.h>
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;
}