需要注意字节序的大端(big endian)和小端(little endian)的几种情景

大端(big endian):在内存中,按照从最低有效字节到最高有效字节的顺序存储对象,即数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中。
小端(little endian):在内存中,按照从最高有效字节到最低有效字节的顺序存储对象,即数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。
下图举例摘自CSAPP:
这里写图片描述
大多数Intel兼容机都用小端模式,IBM和Oracle的大多数机器使用大端模式。有些比较新的微处理器是双端法(bi-endian),即可以把它们配置成大端或小端的机器运行。但是,实际上,一旦选择了特定的操作系统,那么字节序也就固定下来了。对多数应用程序员来说,字节序是透明的,不需要关心,但是,在以下几种情景中,需要注意了:
1、在不同类型的机器之间通过网络传送二进制数据时,网络应用程序的编写必须遵守已建立的字节序规则,发送方将它的内部表示转换成网络标准,而接收方则将网络标准转换为它的内部表示;
2、在检查机器级程序时,阅读表示整数数据的字节系列时字节顺序很重要;
3、对于有些系统级编程来说,有时需要编写规避正常的类型的程序,比如C中的强制类型转换(cast)或联合(union)。
下面给出一个例子检测当前机器是大端存储还是小端存储:

BOOL IsLittleEndianMode()
{
    union _DATA
    {
        int Para1;
        char Para2;
    } data;
    data.Para1 = 1;
    BOOL RetVal = FALSE;
    if ( data.Para2 ==  1 )
    {
        RetVal = TRUE;
    }
    return RetVal;
}

猜你喜欢

转载自blog.csdn.net/zlanbl085321/article/details/80457569