当前位置: 首页 > article >正文

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),具有较高的处理效率。
  • 大端对齐通常用于网络协议中,以确保不同平台之间的数据兼容性,并使得数据在报文中的顺序符合人类的认知习惯。

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


http://www.kler.cn/a/505570.html

相关文章:

  • HTTP 缓存机制详解
  • matlab专栏-M文件
  • 学生资助在线管理软件开发微信小程序ssm+论文源码调试讲解
  • 《AI发展的三个关键视角:基础设施、开源趋势与社会影响》
  • SpringBoot + Websocket实现系统用户消息通知
  • Web后端开发
  • 《零基础Go语言算法实战》【题目 4-6】随机选择单链表的一个节点并返回
  • 《零基础Go语言算法实战》【题目 2-20】通过泛型比较大小
  • 设计模式--命令模式【行为型模式】
  • 【JavaWeb01】JavaWeb开发基础:HTML的深度解析与应用
  • 【计算机网络】lab8 DNS协议
  • Postman下载与使用,新手详细
  • android T 建立文件夹及文件的记录
  • Unity自带的真车模拟系统,速度不够大r时如何以匀速上桥
  • c++ string 类实现
  • 【I/O编程】UNIX文件基础
  • 深度学习中PyTorch张量的重塑操作
  • 下载文件,浏览器阻止不安全下载
  • 前端如何设计一个回溯用户操作的方案
  • c++ 手写queue循环队列