自学内容网 自学内容网

C -- 大端对齐 小端对齐 的人性化解释

网上很多资料对大小端对齐的解释 很多 很全 很准 但为啥老是记不住呢,所有的知识都是基于人性的情感原理,或是世界基本的运行规律而产生的,如果不能把知识和这两点打通,即使记住也很容易忘记。本篇文章基于这两点 分析下大小端对齐。


大小端对齐的分析

1. 概念

  • 小端对齐(Little Endian):低字节存储在低地址。

    示例:

    int a = 0x1122;
    char *p = &a;
    p[0] --> 0x22;  // 低字节存储在低地址
    p[1] --> 0x11;
    
  • 大端对齐(Big Endian):低字节存储在高地址。

    示例:

    int a = 0x1122;
    char *p = &a;
    p[0] --> 0x11;  // 低字节存储在高地址
    p[1] --> 0x22;
    

2. 应用场景

  • 小端对齐:
    • 当前大多数现代处理器(如 x86 和 ARM 处理器)都使用小端对齐。
    • 在这些处理器上,低字节通常存储在低地址。
  • 大端对齐:
    • 网络通信中常使用大端字节序(如 TCP/IP 协议中的字节序)。
    • 大端字节序有时也用于一些嵌入式设备和特定硬件。

3. 本质性讲解

  • 为什么 CPU 处理需要小端对齐?

    • 效率原因: 对于计算机系统而言,存储器访问和数据处理是基于地址的顺序进行的。在小端模式下,低字节存储在低地址,这样在处理数据时,通常会从低字节开始,处理速度更快。
    • 硬件优化: 许多计算机系统和处理器(如 Intel 和 ARM)在设计时对小端存储进行了优化,这使得读取、写入和处理数据时更加高效。特别是对于多字节的数据类型,低字节优先存储可以减少处理器的额外操作,提高效率。
  • 为什么网络字节序要使用大端对齐?

    • 程序员友好: 在网络协议中,数据是按照一定的规则进行传输和解析的,通常采用大端字节序。对于程序员而言,在网络报文中查看数据时,低字节放在高地址的方式(大端字节序)通常更符合人的认知习惯。
    • 这个截图的例子是SOME/IP协议中的字段 通过wireshark工具解析的截图。sessionID 是一个uint16的变量 ,值是0x0aec 报文中的顺序也是0aec ,顺序没变 容易理解 和反应,显然大端存贮对程序员编写网络协议 比较友好。

    • 跨平台一致性: 网络协议的规范通常是为了确保不同平台和架构之间能够正确解析数据。由于不同的硬件平台可能使用不同的字节序(小端或大端),大端字节序确保了在网络中传输的数据能够被所有平台一致地解析。

4. 总结

  • 小端对齐适用于绝大多数现代处理器(如 x86 和 ARM),具有较高的处理效率。
  • 大端对齐通常用于网络协议中,以确保不同平台之间的数据兼容性,并使得数据在报文中的顺序符合人类的认知习惯。

通过将这些点关联到人类认知和计算机设计的基本原则,你可以更容易理解为什么大多数系统采用小端字节序,而网络通信则选择大端字节序。


原文地址:https://blog.csdn.net/weixin_44209111/article/details/145155521

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!