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


    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、小结

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

  • 相关阅读:
    主机连接不上虚拟机或虚拟机桥接没有网络
    asp web 报表
    heart or house?
    CPointer
    Raid
    Dos for by 随风
    不支持uri格式
    FabEdge V0.4 新特性:支持多集群通讯
    运维监控
    /etc缩写
  • 原文地址:https://www.cnblogs.com/Cqlismy/p/12904724.html
Copyright © 2020-2023  润新知