Unverified Commit ccaa3ae0 authored by Early's avatar Early Committed by GitHub
Browse files

Merge pull request #2536 from NachtgeistW/endianness

refactor(endianness.md): 字节顺序
parents 481cfe6a 46d4f0ef
Loading
Loading
Loading
Loading
+19 −13
Original line number Diff line number Diff line
字节顺序是跨越多字节的程序对象的存储规则,表示一个对象的字节的排列方法
本页面将简要介绍字节顺序的概念和分类

字节顺序有两种,分为小端序(little endian)和大端序(big endian)。
## 简介

事实上,这两种字节顺序没有孰优孰劣之分。这两种顺序的名字( `小端``大端` ),正是出自《格列佛游记》一书,书中的两个派别交战的原因是无法就从哪一端打开鸡蛋达成一致。就和鸡蛋的问题一样,选择何种字节顺序成了没有技术上理由的争论
字节顺序是跨越多字节的程序对象的存储规则,表示一个对象的字节的排列方法

当然,字节顺序的不一致会导致二进制数据在不同类型的机器之间进行传输时被反序。为了避免这件事情,网络应用程序建立了一套标准,保证发送过程中是使用约定好的网络标准,而不是不同机器的内部表示。
## 分类

下面,我们以一个位于 `0x100` 处,类型为 `int` ,十六进制值为 `0x01234567` 的变量为例介绍两种字节顺序:
字节顺序有两种,分为小端序(little endian)和大端序(big endian)。

(这里 `0x01` 是最高位有效字节, `0x67` 是最低位有效字节
为方便介绍,接下来以一个位于 `0x100` 处,类型为 `int` ,十六进制值为 `0x01234567` 的变量为例。其中 `0x01` 是最高位有效字节, `0x67` 是最低位有效字节

## 小端序
### 小端序

小端序是指机器选择在内存中按照从 **最低** 有效字节到 **最高** 有效字节的顺序存储对象。

上文提到的变量表示如下:
上文提到的变量表示如下:

| .... | 0x100 | 0x101 | 0x102 | 0x103 | .... |
| ---- | ----- | ----- | ----- | ----- | ---- |
| .... | 67    | 45    | 23    | 01    | .... |

## 大端序
### 大端序

大端序是指机器选择在内存中按照从 **最高** 有效字节到 **最低** 有效字节的顺序存储对象。

上文提到的变量表示如下:
上文提到的变量表示如下:

| .... | 0x100 | 0x101 | 0x102 | 0x103 | .... |
| ---- | ----- | ----- | ----- | ----- | ---- |
| .... | 01    | 23    | 45    | 67    | .... |

## 惯例
### 两种顺序的区别

事实上,这两种字节顺序没有孰优孰劣之分。这两种顺序的名字「小端」和「大端」,正是出自《格列佛游记》一书。书中,小人国里两个派别交战不休的原因是无法就从小端还是大端剥鸡蛋达成一致。就和剥鸡蛋的争论一样,选择何种字节顺序的争论是非技术性的。

当然,字节顺序的不一致会导致二进制数据在不同类型的机器之间进行传输时被反序。为了避免这件事情,网络应用程序建立了一套标准,保证发送过程中是使用约定好的网络标准,而不是不同机器的内部表示。

## 顺序选择惯例

小端序:x86, ARM processors running Android, iOS, and Windows
- 小端序:x86, ARM processors running Android, iOS, and Windows

大端序:Sun, PPC Mac, Internet
- 大端序:Sun, PPC Mac, Internet