必须要知道的编程基础知识

整型

类型 字节(Byte) 位(Bit) 范围
int16 2 2 * 8 = 16 -216 - 1 ~ 216 - 1 - 1
int32 4 4 * 8 = 32 -232 - 1 ~ 232 - 1 - 1
int64 8 8 * 8 = 64 -264 - 1 ~ 264 - 1 - 1

为什么是x - 1次方?

二进制x位所能表示的最大(有符号)十进制数为2x - 1,但是由于第一位是符号位,所以就变成了2x - 1 - 1

为什么最小值不需要减1

对于有符号整型而言,是存在+0-0的,以int16位为例:

0000 0000 0000 0000 // - 0
1000 0000 0000 0000 // + 0

但十进制里面没有-0这么一说,所以就把-0当作是最小负值-2x - 1

int是几位的?

C++中int即为int32

long是几位的?

关于long,C标准没有规定其占用几个字节,只要求不短于int

JS里的二进制

ArrayBuffer

ArrayBuffer是对固定长度连续内存空间的引用。

const buffer = new ArrayBuffer(16);
console.log(buffer.byteLength) // 16

以上代码表示分配一个16字节的连续内存空间,并用0进行预填充。

const view = new Uint8Array(buffer);
console.log(view.length); // 16
console.log(view.byteLength); // 16

将 buffer 视为一个 8 位整数的序列,每位占 1 各字节,则可代表 16 位数。

const view = new Uint16Array(buffer);
console.log(view.length); // 8
console.log(view.byteLength); // 16

将 buffer 视为一个 16 位整数的序列,每位占 1 各字节,则可代表 8 位数。

特殊的Uint8ClampedArray

当数组元素越界时,Uint8Array会自动换算,而Uint8ClampedArray会固定取边界值。

const x = new Uint8ClampedArray([17, -45.3, 257]); // [17, 255, 0]

const x = new Uint8Array([17, -45.3, 257]); // [17, 211, 1]

注意,并不存在Uint16ClampedArrayUint32ClampedArray,可别脑洞大开。

参考资料