大端法和小端法 | 一分钟系列

3,172 阅读4分钟

标签: 公众号文章


用户角度的内存

对于我们这些码农来说,内存相当于由若干个连续的格子组成,画个图就是这样:

image_1di3049vv1lltbflfm71dkkgqb9.png-14.1kB

如图所示的内存结构一共由n个连续的格子组成,每个格子可以存储一个字节的数据(1字节 = 8个位)。每个格子都有它唯一的编号,称之为内存地址。那么:

  • 如果我们的计算机是32位的话,理论上可以访问的内存格子个数就是2³²(也就是4GB),相应的内存地址范围就是:0 ~ 2³² - 1

  • 如果我们的计算机是64位的话,理论上可以访问的内存格子个数就是2⁶⁴(这是一个很大很大的数),相应的内存地址范围就是:0 ~ 2⁶⁴ - 1

字节的权重

我们知道计算机中使用二进制来表示数据,不过二进制对人类来说太不友好,将它们转换成十六进制来看更舒服一些,比方说对于下边这个由4个字节组成的二进制数据(字节之间没有空格,只是为大家看起来美观我才加了空格):

00010010 00110100 01010110 01111000

二进制字节00010010可以被转换成十六进制0x12,二进制字节00110100可以被转换成十六进制0x34,二进制字节01010110可以被转换成十六进制0x56,二进制字节01111000可以被转换成十六进制0x78。所以整个数字转为十六进制数据就是:

0x12345678

其中:

  • 字节0x12在左边,代表着1 × 16⁷ + 2 × 16⁶,这个0x12字节占的权重比较大。

  • 字节0x34代表着3 × 16⁵ + 4 × 16⁴,这个字节占的权重其次。

  • 接着是字节0x56,代表着5 × 16³ + 6 × 16²,这个字节占的权重再次。

  • 最后是字节0x78,代表着7 × 16¹ + 8 × 16⁰,这个0x78字节占的权重是最小的。

高级语言的类型

我们一般是使用高级语言来编程的(区别于机器语言或者汇编语言),高级语言里有一种类型的概念,有的类型的数据要占用连续的几个内存格子。比方说某种语言里有一种称之为int的类型,该类型需要占用4个字节的大小。如果说我们想在高级语言里将下边的这个数(十六进制)设置成int类型:

0x12345678

那这个数据该以怎样的方式塞到内存格子中呢?是该把高权重的字节放到低地址中,还是把高权重的字节放到高地址中呢?这其实和我们吃鸡蛋时应该先从大头剥鸡蛋皮还是先从小头剥鸡蛋皮更好一点的问题差不多,其实没啥不一样。不过最开始设计计算机的大叔们由于事先没商量好,造成了这样的后果:

  • 有的人把高权重的字节放到了低地址中,人们把这样表示多字节数据的方式称之为大端法

    image_1di34u5pk1nv5k1n1fpqorbbkmm.png-24.6kB

  • 有的人把高权重的字节放到了高地址中,人们把这样表示多字节数据的方式称之为小端法

    image_1di34v19poj12cl1tomu4395i13.png-24.6kB

由于最初大家没有商量好,导致对于多字节数据在不同的机器上采用不同的表示方法,这对于程序的可移植性造成了影响。另外,现代社会中网络成了不可或缺的一部分,当将某个多字节数据从一个使用大端法表示的机器中发送到一个使用小端法表示的机器中时,便会造成错误,于是设计网络的大叔规定,数据在网络上进行传输时,必须统一采用大端法进行传输,那么对于使用小端法的机器而言,就得多费一茬手续,再转一下呗~

题外话

写文章挺累的,有时候你觉得阅读挺流畅的,那其实是背后无数次修改的结果。如果你觉得不错请帮忙转发一下,万分感谢~ 这里是我的公众号「我们都是小青蛙」,里边有更多技术干货,时不时扯一下犊子,欢迎关注: