大端模式和小端模式的理解

1、前言

大端模式(Big-Endian),是指数据的高字节存储在内存的低地址中,而数据的低字节存储在内存的高地址中,这样的存储模式有点类似把数据当作字符串顺序处理,地址从小向大增加,而数据从高位到低位存放,通常和我们的阅读习惯一致。

小端模式(Little-Endian),是指数据的高字节存储在内存的高地址中,而数据的低字节存储在内存的低地址中,这样的存储模式将地址的高低和数据位权有效地结合起来。

为什么会有大端模式和小端模式之分呢?这是由于在计算机系统中,是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit,但是在编程语言中,除了8bit的char数据类型以外,还有16bit的short数据类型,32bit的int数据类型等,需要看具体的编译器,另外,对于位数大于8位的处理器,例如,16bit或者32bit宽度的处理器,由于寄存器的宽度大于1个字节,那么必然存在着如何将多个字节安排的问题,因此就有了大端模式和小端模式存储的区分。

2、实例

简单分析一些实例,例如,数据0x12345678在内存中的存储形式:

首先是大端模式存储,数据的高字节存储在内存的低地址端,数据的低字节存储在内存的高地址端,存储方式如下:

低地址--------------->高地址
0x12 | 0x34 | 0x56 | 0x78

而小端模式存储,则是数据的高字节存储在内存的高地址端,数据的低字节存储在内存的低地址端,存储方式如下所示:

低地址--------------->高地址
0x78 | 0x56 | 0x34 | 0x12

接下来,看看一个具体的例子,32bit宽度的数据0x12345678在大端模式和小端模式下,在内存中的存储形式,假设该数据从内存地址0x4000开始存储,如下:

内存地址 大端模式存储 小端模式存储
0x4000 0x12 0x78
0x4001 0x34 0x56
0x4002 0x56 0x34
0x4003 0x78 0x12

大端模式和小端模式存储,并没有谁优谁劣的说法,各自的优势便是对方的劣势,在小端模式下,强制转换数据不需要调整字节的内容,1、2、4字节的存储方式一样,大端模式下,符号位的判定固定为第一个字节,容易判断正负,一般操作系统为小端模式,而通讯协议为大端模式,对于ARM处理器,可以工作在小端模式,也可以工作在大端模式。

3、机器字节序判断

对于机器字节序的判断,可以通过编写一个简单的测试程序进行判断,如下:

#include <stdio.h>

unsigned char IsBigEndian(void)
{
    int a = 0x12345678;
    char b = *(char *)&a; /* 取出低地址保存的数据 */

    if (b == 0x12)
        return 1;
    else
        return 0;
}

int main(int argc, char *argv[])
{
    unsigned char flag = IsBigEndian();

    if (flag)
        printf("Big-Endian
");
    else
        printf("Little-Endian
");
    
    return 0;
}

还有更多的判断方式判断,可以自行了解。

4、小结

本文简单总结了大端模式和小端模式这两种数据存储方式的理解。

原文地址:https://www.cnblogs.com/Cqlismy/p/12904724.html