大端序、小端序以及基于go的示例
关于大端序、小端序的讲解文章其实不少,我这边以我的理解梳理一下。
内存高地址和地址
要了解大小端序的概念, 首先我们要了解下数据在内存的组成是怎样的。我们用16进制来模拟,16进制0x11,,转为二进制就是 0001 0001 , 那么假如我有如下数据 0x11223344, 转为二进制就是 0001 0001 0010 0010 0011 0011 0100 0100,因为8bit就是1byte,所以 0x11223344一共就是4byte,4个byte的数据值分别是11, 22, 33, 44, 每个数据值占8bit,8bit组成1byte,每一个byte有一个对应的内存位,假设这四个内存地址是 0x0001, 0x0002, 0x0003, 0x0004,这4个内存地址是连续的, 按照内存高低地址规则, 0x0001是最低地址,从低到高顺序, 0x0004是最高地址。
数据的高位字节和低位字节
我们来看数据 0x11223344, 44是这个数据的最低位, 因为数据值最小, 11是数据的最高位,那么0x11223344按照常规的人可读的顺序来看应该是从高到低(因为人读的顺序是从左到右)。
大端序
所谓大端序,就是内存的最高位储存数据的最低位, 内存的最低位储存数据的最高位。
用我们的例子来展示就是 0x0004的内存最高地址, 储存44这个数据值最低字节, 0x0001的内存最低地址, 储存11这个数据值最高字节。
小端序
所谓小端序,跟大端序刚好相反,就是内存的最低位储存数据的最低位, 内存的最高位储存数据的最高位。
用我们的例子来展示就是 0x0004的内存最高地址, 储存11这个数据值最高字节, 0x0001的内存最低地址, 储存44这个数据值最高字节。
程序范例
输出 [1 2 3 4], 下标0(对应数据1)是内存最低位, 所以储存了数据最高位 0
总结
通过范例程序我们可以看到,其实大端序有更符合常规可读性,比如0x01020304这个数据假如按照大端位的储存,组合成byte数组,那么顺序就是[1 2 3 4],从左到右分别为1, 2, 3, 4, 这个顺序是符合原来数据的顺序的,所以在一些程序逻辑处理的时候,某些场景会比小端序适合。不管是用大端序还是小端序,都是数据的储存在内存里面的一种方式的选择,我们知道这样设计的目的,明白底层原理就可以了。