大端模式(Big_endian): 字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。
小端模式(Little_endian): 字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。
高字节表示的是权位的高低,例如十位比个位高,即左边的比右边的高;
高地址即右边的比左边的高。
另外一种说法是:
Little Endian就是低字节排放在内存的低端,高位字节排放在内存的高端,Intel处理器大多数小端字节序。
Big Endian就是高位字节排放在内存的低端,低位字节排放在内存的高端,Motorola处理器大多数使用大端字节序。
例如1 的二进制是 00 00 00 01 ,01是低位,从右往左依次是高位。
01-04代表的地址从低到高。此时的存储方式就是大端模式。
同理,可以判断此时的存储模式是小端模式。
一个简单的判断机器 是大端还是小端的程序:
bool CheckModle(){
union{
char ch;
int a;
}un;
un.a = 1;
return un.ch == 1;
}
int main(){
bool flag = CheckModle();
if (flag)
{cout << “This is Little Modle.” << endl;}
else
{cout << “This is Big Modle.” << endl;}
return 0;
}
union型数据所占的空间等于其最大的成员所占的空间。其中的类型公用一个空间。
union的有效值是最后一次赋值。谁最后一次赋值就是谁。
所以首先给你占两个字节的整型的a赋值1,然后判断char类型中1是如何存储的,则可以判断出是大端模式还是小端模式。
网路字节序:Tcp/Ip各层协议将字节序定义为Big Endian,因此Tcp/Ip协议中使用的字节序通常称之为网络字节序。
union IP{
unsigned long val;
struct{
unsigned char ip1;
unsigned char ip2;
unsigned char ip3;
unsigned char ip4;
};
};
int main(){
unsigned long value = 7491947914;
IP ip;
ip.val = value;
cout<<(int)ip.ip1<<"."<<(int)ip.ip2<<"."<<(int)ip.ip3<<"."<<(int)ip.ip4<<endl;
return 0;
}