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

标签: 公众号文章编程


用户角度的内存

对于咱们这些码农来讲,内存至关于由若干个连续的格子组成,画个图就是这样:bash

image_1di3049vv1lltbflfm71dkkgqb9.png-14.1kB

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

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

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

字节的权重

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

00010010 00110100 01010110 01111000
复制代码

二进制字节00010010能够被转换成十六进制0x12,二进制字节00110100能够被转换成十六进制0x34,二进制字节01010110能够被转换成十六进制0x56,二进制字节01111000能够被转换成十六进制0x78。因此整个数字转为十六进制数据就是:cdn

0x12345678
复制代码

其中:blog

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

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

  • 接着是字节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

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

题外话

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

相关文章
相关标签/搜索