面试题:什么是大端序?什么是小端序?

大端序(Big Endian) 和 小端序(Little Endian) 是两种不同的字节序(Byte Order),用于描述多字节数据(如整数、浮点数)在内存中的存储方式。它们的区别在于字节的排列顺序


1. 大端序(Big Endian)

  • 定义:数据的高位字节存储在内存的低地址处,低位字节存储在内存的高地址处。
  • 特点
    • 字节顺序与人类书写数字的顺序一致(从左到右,高位在前)。
    • 网络传输中通常使用大端序(因此大端序也称为网络字节序)。

示例:
假设有一个 32 位整数 0x12345678,其内存布局如下:

内存地址存储内容
低地址0x12
0x34
0x56
高地址0x78

2. 小端序(Little Endian)

  • 定义:数据的低位字节存储在内存的低地址处,高位字节存储在内存的高地址处。
  • 特点
    • 字节顺序与人类书写数字的顺序相反(从右到左,低位在前)。
    • 大多数现代处理器(如 x86、ARM)使用小端序。

示例:
同样以 32 位整数 0x12345678 为例,其内存布局如下:

内存地址存储内容
低地址0x78
0x56
0x34
高地址0x12

3. 如何判断系统的字节序

可以通过编写简单的代码来判断当前系统的字节序。

示例:

#include <iostream>

int main() {
    int num = 0x12345678;
    char* p = reinterpret_cast<char*>(&num);

    if (p[0] == 0x78) {
        std::cout << "Little Endian" << std::endl;
    } else {
        std::cout << "Big Endian" << std::endl;
    }

    return 0;
}

解释

  • 将整数 0x12345678 的地址强制转换为 char* 类型。
  • 检查第一个字节(低地址)的值:
    • 如果是 0x78,则是小端序。
    • 如果是 0x12,则是大端序。

4. 字节序的应用场景

  1. 网络通信
    • 网络协议(如 TCP/IP)通常使用大端序(网络字节序)。
    • 在发送和接收数据时,需要进行字节序的转换(如 htonlntohl 等函数)。
  2. 文件格式
    • 某些文件格式(如 JPEG、PNG)规定了字节序。
    • 读取或写入文件时需要注意字节序。
  3. 跨平台开发
    • 不同平台可能使用不同的字节序。
    • 在跨平台开发时,需要处理字节序的兼容性问题。

5. 字节序转换函数

在网络编程中,通常需要将主机字节序(Host Byte Order)转换为网络字节序(Network Byte Order),或反之。常用的函数有:

  • htonl:将 32 位整数从主机字节序转换为网络字节序。
  • htons:将 16 位整数从主机字节序转换为网络字节序。
  • ntohl:将 32 位整数从网络字节序转换为主机字节序。
  • ntohs:将 16 位整数从网络字节序转换为主机字节序。

示例:

#include <iostream>
#include <arpa/inet.h> // 或 <winsock2.h>(Windows)

int main() {
    uint32_t hostLong = 0x12345678;
    uint32_t netLong = htonl(hostLong);

    std::cout << std::hex << "Host: " << hostLong << ", Network: " << netLong << std::endl;

    return 0;
}

6. 总结

  • 大端序:高位字节存储在低地址处,低位字节存储在高地址处。
  • 小端序:低位字节存储在低地址处,高位字节存储在高地址处。
  • 判断字节序:通过检查内存中字节的排列顺序。
  • 应用场景:网络通信、文件格式、跨平台开发等。
  • 字节序转换:使用 htonlhtonsntohlntohs 等函数。

理解字节序对于处理二进制数据、网络编程和跨平台开发非常重要。

THE END
点赞5 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容