什么是字节序?

什么是字节序?

字节序指的是多字节数据在内存中的存储顺序。就像一本书可以从左往右读,也可以从右往左读一样,计算机存储多字节数据也有不同的顺序。


两种主要的字节序

1. 大端序 (Big-Endian)

  • 高字节在前,低字节在后
  • 就像我们写数字:1234,千位(1)在前,个位(4)在后
  • 人类思维模式:从最重要的部分开始

存储示例0x12345678 在内存中的存储

地址:   0x1000   0x1001   0x1002   0x1003
数据:   0x12     0x34     0x56     0x78
        ↑
        最高有效字节(MSB)在前

2. 小端序 (Little-Endian)

  • 低字节在前,高字节在后
  • 就像倒着写数字:4321,个位(4)在前,千位(1)在后
  • 计算机偏好:很多CPU架构采用这种方式

存储示例0x12345678 在内存中的存储

地址:   0x1000   0x1001   0x1002   0x1003
数据:   0x78     0x56     0x34     0x12
        ↑
        最低有效字节(LSB)在前

直观比喻

电话号码比喻

  • 大端序:+86-138-0011-2233(国家码在前)
  • 小端序:2233-0011-138-+86(本地号码在前)

日期格式比喻

  • 大端序:2023-12-25(年-月-日)
  • 小端序:25-12-2023(日-月-年)

实际代码示例

#include <stdio.h>

void check_endianness() {
    int num = 0x12345678;
    char *ptr = (char *)&num;
    
    printf("数字: 0x%x\n", num);
    printf("内存存储: ");
    for(int i = 0; i < sizeof(int); i++) {
        printf("%02x ", ptr[i] & 0xFF);
    }
    printf("\n");
    
    if(ptr[0] == 0x78) {
        printf("这是小端序系统\n");
    } else {
        printf("这是大端序系统\n");
    }
}

int main() {
    check_endianness();
    return 0;
}

不同架构的偏好

架构 字节序 代表系统
x86/x86-64 小端序 Intel/AMD PC
ARM 可配置 移动设备、嵌入式
PowerPC 大端序 旧苹果电脑、游戏机
MIPS 可配置 网络设备、嵌入式
SPARC 大端序 服务器
RISC-V 小端序 新兴架构

网络字节序

由于不同系统字节序不同,网络传输统一使用大端序

#include <arpa/inet.h>

// 主机序转网络序(大端序)
uint32_t htonl(uint32_t hostlong);    // 32位
uint16_t htons(uint16_t hostshort);   // 16位

// 网络序转主机序
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);

实际应用中的重要性

  1. 文件格式:PNG、JPEG等使用大端序
  2. 网络协议:TCP/IP使用大端序
  3. 数据交换:不同系统间数据传输必须考虑字节序
  4. 内存映射:直接操作内存时需要知道字节序

如何选择?

  • 性能考虑:小端序在某些操作上更有优势
  • 兼容性:网络通信必须使用大端序
  • 可读性:大端序更符合人类阅读习惯

posted on 2026-02-04 10:59  四季萌芽V  阅读(0)  评论(0)    收藏  举报

导航