Byte、Word 与 Endianness 思考记录
背景
CSAPP 第二章讨论数据在机器中的表示方式。
在理解大端法和小端法之前,需要先分清:
byte和word的关系- 十六进制数如何拆成字节
- 高位字节和低位字节是什么意思
- 字节序讨论的是数值内部的位权,还是内存中的地址顺序
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 bitword 是由多个 byte 组成的整体:
1 word = 若干 byte例如把 0x01234567 看成一个 32 位 word:
word: 0x01234567
byte: 0x01 0x23 0x45 0x67结论
word 是整体,byte 是组成这个整体的字节单位。
可以按这个层级理解:
bit -> byte -> wordQ3:高位字节和低位字节是什么意思?
初始理解
对于:
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 是最低有效字节大端法和小端法不会改变这个数值本身。
它们只决定这些字节在内存中按地址从低到高如何排列。