本文最后更新于 2025-11-21,文章内容可能已经过时。

大小端是指计算机存储多字节数据时的字节顺序:大端模式(Big-Endian)将高位字节存放在内存低地址,符合人类阅读习惯,常用于网络传输;小端模式(Little-Endian)将低位字节存放在内存低地址,是Intel/AMD处理器和几乎所有个人电脑(Windows/Mac/Linux)的默认模式。在跨系统通信(如网络传输、文件共享)时,必须进行字节序转换(如Go中的binary.BigEndian和binary.LittleEndian),否则会导致数据解析错误,就像两个人用不同的书写方向交流需要统一规则一样。

一、大小端

想象你有一串珠子,每颗珠子上写着一个数字,比如"1234"这个数字。

大端模式:像书一样从左到右写

  • 你从左到右摆珠子:先放"1",然后"2",然后"3",最后"4"
  • 阅读时也从左到右,符合我们平时看数字的习惯
  • 就像写电话号码:138-1234-5678,先写前面的数字

小端模式:从右到左写

  • 你从左到右摆珠子,但是先放最后一位:先放"4",然后"3",然后"2",最后"1"
  • 阅读时需要从右往左看才能得到正确数字
  • 就像有些人写数字时先写个位,再写十位,再写百位...

具体例子

  • 假设数字是 258 (十六进制 0x0102(每个十六进制数字对应4位二进制数0000 0001 0000 0010),在计算机里占两个"格子")
    • 大端模式:第一个格子放 01,第二个格子放 02
    • 小端模式:第一个格子放 02,第二个格子放 01

为什么有这两种方式?

  • 不同厂家生产的电脑"书写习惯"不同
  • 就像有人习惯右手写字,有人习惯左手写字
  • 大部分Windows电脑(英特尔处理器)用小端
  • 网络传输和苹果部分设备用大端

为什么要关心这个?

当你把一个电脑上的数据传给另一个电脑时,如果它们使用不同的"书写习惯",数字就会被读错,就像把"1234"读成了"4321"。

这就像不同国家的人见面,一个是从左向右写文字,一个是从右向左写文字,需要先统一规则才能正确理解对方。


二、大小端的本质:不是操作系统决定的

大小端(字节序)本质上是计算机硬件架构的特性,而非操作系统层面的概念。更准确地说:

  • 由CPU架构决定:Intel/AMD处理器固定使用小端模式,而某些架构(如ARM、PowerPC)可配置
  • 操作系统继承硬件特性:Windows运行在x86/x64硬件上所以是小端,但这不是Windows自己决定的
  • 跨层次影响:
    • 硬件层:CPU设计决定基础字节序
    • 系统层:操作系统提供字节序转换API(如htonl)
    • 应用层:程序需要处理不同字节序的数据(如网络通信)
    • 协议层:网络标准规定使用大端(网络字节序)

三、常见

小端模式 (Little-Endian) - 现代最常见

  • 个人电脑/服务器
    • 所有Intel处理器的电脑(从386到现在的Core i9)
    • 所有AMD处理器的电脑
    • Windows、Linux、Mac(基于Intel/AMD的版本)
  • 移动设备
    • 大多数Android手机和平板
    • iPhone和iPad(虽然用ARM芯片,但配置为小端模式)
  • 游戏机
    • PlayStation、Xbox、Nintendo Switch

简单说:你日常用的电脑、手机90%以上都是小端模式

大端模式 (Big-Endian) - 特定领域

  • 网络通信
    • 所有互联网协议(TCP/IP)使用大端(称为"网络字节序")
    • 网络数据包在传输前需要转换为大端
  • 专业设备
    • 一些老式Sun服务器(SPARC架构)
    • 部分IBM大型机
    • 一些网络路由器和交换机内部
  • 虚拟机
    • Java虚拟机(JVM)内部使用大端
    • 部分虚拟机和模拟器

可切换模式的系统

某些现代处理器(如ARM、PowerPC)可以根据软件需要切换大小端模式,就像汽车可以切换左右舵一样。