处理器有两种:
Big_endian 、Little_endian 的模式
Big_endian模式对操作数的存放方式是从高字节到低字节。高字节存放数字的低位,低字节存放数据的高位。
Little_endian模式对操作数的存放方式是从低字节到高字节。低字节存放数字的低位,高字节存放数据的高位。
如:0x1234
内存地址:0x4000 0x4001
Little_endian: 0x4000: 0x34 0x4001: 0x12
Big_endian : 0x4000: 0x12 0x4001: 0x34
联合体union 的存放顺序是所有成员都从低地址开始存放。联合体(共用体)的数据成员都是从低地址开始存放。
使用union可以查看CPU的模式。若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1
代码如下:
#include<iostream>
using namespace std;
int CheckCPU()
{
union w
{
int a;//4 bytes
char b;//1 bytes
}c;
c.a=1;
return (c.b==1);
}
int main(int argc, char* argv[])
{
int i;
i=CheckCPU();
if (i==1)
{
cout<<"Little_endian"<<endl;
}
else
{
cout<<"Big_endian"<<endl;
}
return 0;
}
若是大端模式,由低地址到高地址c.a存放为0x00 0x00 0x00 0x01,c.b被赋值为0x00
若是小端模式,由低地址到高地址c.a存放为0x01 0x00 0x00 0x00,c.b被赋值为0x01
下面一个例子:
#include<iostream>
using namespace std;
void CheckCPU()
{
union w
{
char b[4];//1 bytes
int a;//4 bytes
short int d;//2 bytes
}c;
c.b[0]=2;
c.b[1]=1;
c.b[2]=3;
c.b[3]=0;
cout<<"c.a="<<c.a<<endl;
cout<<"c.d="<<c.d<<endl;
}
int main(int argc, char* argv[])
{
CheckCPU();
return 0;
}
输出:
c.a=196866
c.d=258
b中数据为:0x02 0x01 0x03 0x00
a: 4个字节,所以,
Big_endian : 内存中数据存放为:0x02 0x01 0x03 0x00
Little_endian: 内存中数据存放为:0x00 0x03 0x01 0x02 c.a=0x00 0x03 0x01 0x02 =196866
d: 2个字节,所以,
Big_endian : 内存中数据存放为:0x02 0x01 0x03 0x00
Little_endian: 内存中数据存放为:0x01 0x02 0x00 0x03 c.d=0x01 0x02=258