大端模式:(big-endian)
是指数据的高字节保存在内存的低地址中,而数据的低字节保存类似把数据当初
字符串处理,例如字符串指针指向的时字符串的首地址,这与栈的生长方向无关。
小端模式:(little-endian)
指数据的高字节保存在内存的高地址中,这种存储模式将地址的高低和数据位权
(位权表示数制中每一固定位置对应的单位值,如10进制中,第一位的位权为1,
第二位的位权为10.)有效的结合起来,位权高的对应高地址.
下面我们看看如何确定我们的编译器是大端还是小端模式。
#include<iostream>
using namespace std;
union pr{//创造一个联合数据结构
char a1;
int b;
};
int main()
{//这是第一种方法
cout << sizeof(pr) << endl;//得到这个数据结构占据4个字节
pr a;
a.b = 1;
cout << static_cast<int> (a.a1) << endl;;//使用cout需要强制转换
printf("%d\n", a.a1);//打印为1则证明我这里是大端
//下面是第二种方法
pr a2;
a2.b = 1;
printf("%d", *(char *)&a2.b);//这里是利用int所占的四个字节可以转换成类似数组的形式,所以解引用后就是首地址。
system("pause");
}
为什么会有大小端之分,主要在于在计算机系统中,我们是以自己为单位的,一个自己对应
8bit,但是除了8bit外,还有32bit,那么必然导致一个问题,如何去安排多个字节,因此
就导致了大小端问题。
总结
在计算机系统中,我们不但需要1个字节的数据类型,可能还需要4个字节的数据类型
那么就必然导致一个问题,多个字节的数据类型如何在内存中存储。
于是便有了大小端模式,大端模式好像我们平时的阅读习惯,从高位权对应低内存地址
小端模式则是高位权对应高地址。而如何判断我们的编译器是大端模式还是小端模式,那么
我们应该应该想到我们需要一块多字节的内存,并且我们利用了union这种数据结构,因为这种数据
结构是共享内存地址的,我们就可以利用char 和int就可以轻易的判断出我们的环境是小端还是大端。