Byte、Word 与 Endianness 思考记录

背景

CSAPP 第二章讨论数据在机器中的表示方式。

在理解大端法和小端法之前,需要先分清:

  • byteword 的关系
  • 十六进制数如何拆成字节
  • 高位字节和低位字节是什么意思
  • 字节序讨论的是数值内部的位权,还是内存中的地址顺序

Q1:0x01234567 为什么每两位是一个字节?

初始理解

0x01234567 是一个十六进制表示的数。

需要判断它内部的字节应该如何划分。

思考过程

十六进制中:

1 位十六进制 = 4 bit

所以:

2 位十六进制 = 8 bit = 1 byte

因此:

0x01234567

可以拆成:

0x01  0x23  0x45  0x67

每一组都是一个字节。

结论

0x01234567 有 8 位十六进制数:

8 位十六进制 = 32 bit = 4 byte

所以它可以看成一个由 4 个字节组成的 32 位数据。


Q2:byte 和 word 有什么关系?

初始理解

byte 是字节。

word 是字。

需要明确两者是不是同一个层级。

思考过程

byte 是更小的组成单位:

1 byte = 8 bit

word 是由多个 byte 组成的整体:

1 word = 若干 byte

例如把 0x01234567 看成一个 32 位 word:

word: 0x01234567
 
byte: 0x01  0x23  0x45  0x67

结论

word 是整体,byte 是组成这个整体的字节单位。

可以按这个层级理解:

bit -> byte -> word

Q3:高位字节和低位字节是什么意思?

初始理解

对于:

0x01234567

需要判断哪个字节是高位字节,哪个字节是低位字节。

思考过程

这个数可以拆成:

0x01  0x23  0x45  0x67

从数值权重来看,越靠左的字节权重越高,越靠右的字节权重越低。

因此:

高位字节                         低位字节
0x01        0x23        0x45        0x67

结论

对于 0x01234567

最高有效字节 = 0x01
最低有效字节 = 0x67

这里的高位和低位描述的是数值本身的位权高低。


Q4:大端法和小端法本质上在说什么?

初始理解

大端法和小端法似乎是在讨论:

从内存低位到高位,是先放最高有效字节,还是最低有效字节。

思考过程

这里需要修正措辞:

不要说内存低位到高位

更准确的说法是:

内存低地址到高地址

因为“高位/低位”用于描述数值内部的位权;而内存中讨论的是地址顺序。

大端法:

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

小端法:

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

结论

大端法和小端法讨论的是:

多字节对象在内存中,从低地址到高地址的字节排列顺序。

一句话:

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

最终理解

对于数值:

0x01234567

它本身可以拆成:

0x01  0x23  0x45  0x67

其中:

0x01 是最高有效字节
0x67 是最低有效字节

大端法和小端法不会改变这个数值本身。

它们只决定这些字节在内存中按地址从低到高如何排列。