Endianness(字节序)

Problem(解决什么问题)

一个多字节对象由多个字节组成。

例如:

0x01234567

可以拆成 4 个字节:

0x01  0x23  0x45  0x67

问题是:

当这个多字节对象放入内存时,这些字节应该按照什么顺序排列?

字节序讨论的就是这个问题。


Basic Idea(核心思想)

字节序讨论的是:

一个多字节对象在内存中,按地址从低到高,字节如何排列。

注意:

内存中应该说低地址到高地址

不要说:

内存低位到高位

因为“高位”和“低位”通常描述的是数值内部的位权;而内存中讨论的是地址高低。


Big Endian(大端法)

大端法:

低地址存放最高有效字节

对于:

0x01234567

从低地址到高地址,内存排列为:

低地址 -> 高地址
0x01  0x23  0x45  0x67

也就是先放最高有效字节 0x01


Little Endian(小端法)

小端法:

低地址存放最低有效字节

对于:

0x01234567

从低地址到高地址,内存排列为:

低地址 -> 高地址
0x67  0x45  0x23  0x01

也就是先放最低有效字节 0x67


What Changes(改变的是什么)

不管使用大端法还是小端法,数值本身没有变:

0x01234567

它的最高有效字节始终是:

0x01

它的最低有效字节始终是:

0x67

改变的只是:

这些字节在内存地址中的排列顺序

Summary(总结)

大端法:低地址存放最高有效字节。
小端法:低地址存放最低有效字节。

字节序的核心不是改变数值本身,而是决定多字节对象在内存中从低地址到高地址的字节排列方式。