1 第一点,先要明白一个,就是系统在申请内存的时候,是从高地址到低地址还是从低地址到高地址。

先用下面一个简单的程序来判断申请的内存地址顺序问题。下面是一个典型的内存结构图。


如何判断系统是大端还是小段算法_大端小端 内存结构

我们用下面这个程序来检验:

#include <stdio.h>
int main()
{
int a;
int b;
printf("%p\n",&a);//先申请a空间 并且a的地址更高
printf("%p\n",&b);
return 0;
}


输出结果是:

如何判断系统是大端还是小段算法_大端小端 内存结构_02


可以看出,栈空间的申请是从高到低的。


2 有了上面的概念后,我们开始进行大端小端的分析。

先引入一则关于大端和小端的故事:端模式(Endian)的这个词出自Jonathan Swift书写的《格列佛游记》。这本书根据将鸡蛋敲开的方法不同将所有的人分为两类,从圆头开始将鸡蛋敲开的人被归为Big Endian,从尖头开始将鸡蛋敲开的人被归为Littile Endian。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开。在计算机业Big Endian和Little Endian也几乎引起一场战争。在计算机业界,Endian表示数据在存储器中的存放顺序。

简单来说,大端就是将高位字节放到低位地址空间里,小端就是将高位字节放到高位字节。

那么如何检测一个系统是大端还是小端,我们可以用下面的代码:

#include <stdio.h>
//判断操作系统是大端还是小端
bool checkendian()
{
union my
{
int a;
char b;
};
my t;
t.a=1;
return(t.b==1);
}
int main()
{
printf("%d\n",checkendian());
return 0;
}


结果输出是1,说明是小端的,具体分析如图:

如何判断系统是大端还是小段算法_地址空间_03