计算机内的大小端模式

一、什么是大端与小端模式?

大端模式英文叫Big-Edian,小端模式英文叫little-Endian.

简单说:

大端模式:低字节存放在内存的低地址,高字节存放在内存的高地址(跟我们的一般思维相一致);

小端模式:与上面的大端模式恰恰相反。

比如:0x12345678,这32bit的数字,在内存中分别按照大小端的存放形式为:

大端模式:低字节------>高字节

          12 34 56 78

小端模式:高字节------>低字节

          78 56 34 12


二、为什么要有大端和小端模式?

因为在计算机系统中都是以字节为单位进行存储的,一个字节为8bit,但是在C语言中除了有8bit的char型之外,还有其他数据类型。对于位数大于8位的处理器(比如16位或者32位处理器),在寄存器中必然会存在一个字节安排的问题。由此便有了大端小端模式的区分了。


三、怎么判别大端和小端模式?

方法一:

#include<iostream>
using namespace std;
bool IsBigEndian();
int main()
{
    cout<< IsBigEndian()<<endl;
    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位数据类型主机字节顺序到网络字节顺序的转换


你可能感兴趣的:(大端模式,小端模式)