要不, 我们从右往左书写数组?

这个就有意思了, 我们发现, 我们如果换一种书写方式, 可以更直观理解数组在内存中模样.

事件起因

前些天阅读一本js 相关书籍的时候, 看到这么一段话.

var buffer = new ArrayBuffer(12);

var x1 = new Int32Array(buffer);
x1[0] = 1;

var x2 = new UInt8Array(buffer);
x2[0] = 2;

x1[0] // 2

显而易见, 上述寥寥代码的主要内容是在阐述 TypedArray仅仅作为 ArrayBuffer 视图读写内存的道理. x1和x2公用了同一段内存._

Typed arrays in an ArrayBuffer

而我今天想说这里有一个很有意思的事情.

字节序

大家公认的概念, 也是计算机基础理论知识的一部分.

  1. 内存中使用8个二进制位(bit)表示一个字节(Byte).

  2. UInt8 是使用一个字节表示的无符号整数

  3. UInt32 则是使用了4个字节表示的无符号整数

我们使用无符号整数这样简单的数据结构, 来看看刚刚的赋值过程做了什么.

x1[0] = 1

我们知道, x1是一个 Int32视图, 所以第一个元素的长度是四个字节. 也就是说, 该部分的值是 0x000001.

高位低位
00000001
x2[0] = 2

我们知道, x2是一个 Int8视图, 所有第一个元素的长度是一个字节, 也就是说, 该部分的值是 0x02.

瞧, 现在 x1[0] 应该变成什么样?

0x00000002 ?

高位低位
00000002

还是 0x02000001 ?

高位低位
02000001

这个问题的本质, 即 __内存中, Int32数据类型内部的四个字节, 是低位在前, 还是高位在前?__.

如果是高位在前, 则x2[0]指向的是 x1[0]最高位的字节. 反之, 则是指向的最低位.

关于字节序, 在计算机的世界里有这样一种定义和区分. 大端序/小端序.

详细设定我们参考 (wiki)[https://zh.wikipedia.org/wiki... 就好.

我们绝大多数时候再现代计算机上使用的字节, 都是小端序.

而网络传输中使用的是大端序, 如 IP 报头

瞧, 书写一个数组试试.

假设我们有一个 UInt16Array(3)

var x3 = new UInt16Array([11, 22, 33]);

我们在草稿纸上会这么写

x3[0]x3[1]x3[2]
112233

也就是说我们习惯性把第一元素写在左边. 换成十六进制的写法就是

如果现在没看出来为什么我想说从左到右书写数组会造成有趣的误解, 那我再试着用二进制方式把这个数组写出来 :)

注意,最左边一个格子是 x3[0] 哦! 这时候, 我们试着使用x2这样的 UInt8Array 视图来解读这个数组.

正确的解读应该是

000010110000000000010000000000000010000100000000
0x0B0x000x160x000x210x00
110220330

而不是

000000000000101100000000000100000000000000100001
0x000x0B0x000x160x000x21
011022033

因为, 小端字节序的设计中, __低位在前__.

所以, 如果我们一开始就在脑海中将所构思的数组从右往左书写

x3[2]x3[1]x3[0]
332211
0x00210x00160x000B
00000000 0010000100000000 0001000000000000 00001011

改变数据类型去解读的结果则是

x2[5]x2[4]x2[3]x2[2]x2[1]x2[0]
000000000010000100000000000100000000000000001011
0x000x210x000x160x000x0B
033022011

看! 完全不会有交换字节带来的误解!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值