[关闭]
@yangfch3 2017-10-28T12:46:29.000000Z 字数 1334 阅读 2091

用 Buffer 理解 JavaScript 的 Number 系统

JavaScript


一个实例备忘 JavaScript 的数码系统

Buffer 及其存储

  1. const buf = Buffer.from([1, 2, 3, 4, 5, 6, 7, 8]);
  2. console.log(buf);
  3. // <Buffer 01 02 03 04 05 06 07 08>


底层存储:

  1. 00000001 00000010 00000011 00000100 00000101 00000110 00000111 00001000

大端读取

  1. ...


buf.readDoubleBE()

  1. 符号位 偏移量 定点部分(52位)
  2. 0 00000010000 00100000001100000100000001010000...


定点部分转小数:0.2514725105728566

  1. let str = '0010000000110000010000000101000001100000011100001000';
  2. let total = str.split('').reduce(function (sum, value, index, arr) {
  3. sum = sum + value * Math.pow(0.5, index + 1);
  4. return sum;
  5. }, 0);
  6. console.log(total); // 0.2514725105728566


位移量转指数:

  1. 位移量转 10 进制:00000010000 -> 16
  2. 2^10 - 1 + x = 16
  3. => x = -1007


最终结果:(0.2514725105728566 + 1) * 2^-1007 = 8.20788039913184e-304
image_1btbbnlau16b1d3e1oo213nctia9.png-6.6kB

小端读取

  1. ...


buf.readDoubleLE()

  1. 符号位 偏移量 定点部分(52位)
  2. 0 00010000000 11100000110000001010000010...


定点部分转小数:0.4389696270665129

  1. let str = '0111000001100000010100000100000000110000001000000001';
  2. let total = str.split('').reduce(function (sum, value, index, arr) {
  3. sum = sum + value * Math.pow(0.5, index + 1);
  4. return sum;
  5. }, 0);
  6. console.log(total); // 0.4389696270665129


位移量转指数:

  1. 位移量转 10 进制:00010000000 -> 128
  2. 2^10 - 1 + x = 128
  3. => x = -895


最终结果:(0.4389696270665129 + 1) * 2^-895 = 5.447603722011605e-270
image_1btbcktar10d11jkbauhcl11kpr16.png-2.2kB

大端写入

  1. const buf = Buffer.allocUnsafe(8);
  2. buf.writeDoubleBE(5);


5 的二进制表示:101 => 1.01 * 2^2

64 位双进度表示:0010000000010100000000...

  1. 符号位 偏移量 定点部分
  2. 0 2^10 - 1 + 2 0100000000...

每个字节表示成 16 进制:40 14 00 00 00 00 00 00

↓ 大端写入

<Buffer 40, 14, 00, 00, 00, 00, 00, 00>
image_1btbhpb781t82ij6pdafs3vlg9.png-5kB

小端写入

与大端写入转换相近,只是写入时使用的是小端写入。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注