一、什么是大端与小端模式?
大端模式英文叫Big-Edian,小端模式英文叫little-Endian.
简单说:
大端模式:低字节存放在内存的低地址,高字节存放在内存的高地址(跟我们的一般思维相一致);
小端模式:与上面的大端模式恰恰相反。
比如:0x12345678,这32bit的数字,在内存中分别按照大小端的存放形式为:
大端模式:低字节------>高字节
12 34 56 78
小端模式:高字节------>低字节
78 56 34 12
二、为什么要有大端和小端模式?
因为在计算机系统中都是以字节为单位进行存储的,一个字节为8bit,但是在C语言中除了有8bit的char型之外,还有其他数据类型。对于位数大于8位的处理器(比如16位或者32位处理器),在寄存器中必然会存在一个字节安排的问题。由此便有了大端小端模式的区分了。
三、怎么判别大端和小端模式?
方法一:#include
using namespace std;
bool IsBigEndian();
int main()
{
cout<< IsBigEndian()<
system("pause");
return 0;
}
bool IsBigEndian()
{
int a = 0x1234;
char b = *(char *)&a; //通过将int强制类型转换成char单字节,通过判断起始存储位置。即等于 取b等于a的低地址部分
if( b == 0x12)
{
return true;
}
return false;
}
方法二:利用联合体union的成员都是从低地址开始存放的性质:BOOL IsBigEndian()
{
union NUM
{
int a;
char b;
}num;
num.a = 0x1234;
if( num.b == 0x12 )
{
return TRUE;
}
return FALSE;
}
比方法一要更简单一些。
四、大端小端模式怎么进行转换?
一般通信系统都是小端,操作系统都是大端。
不同端模式的处理器进行端模式的转换时,必须考虑端模式的不同,比如进行网络数据的传输的时候。在SOCKET编程中,以下几个函数用于大小端数据的转换:#define ntohs(n) //16位数据类型网络字节顺序到主机字节顺序的转换
#define htons(n) //16位数据类型主机字节顺序到网络字节顺序的转换
#define ntohl(n) //32位数据类型网络字节顺序到主机字节顺序的转换
#define htonl(n) //32位数据类型主机字节顺序到网络字节顺序的转换