必须要知道的编程基础知识
整型
| 类型 | 字节(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 |
- 一个字节是8位
- 无符号整型因为不需要符号位所以可表示的数会多一位
为什么是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]
注意,并不存在Uint16ClampedArray、Uint32ClampedArray,可别脑洞大开。