BigIntegers 如何在基础层面详细工作?

How do BigIntegers work in detail at the fundamental level?

我看到 Explain BigInt Like I'm Five, but I already understand what a BigInt is. I want to know how to make one though. I am trying to pick apart BigInt.js (the v8 bigint.cc 太大了,我对 C++ 不熟悉)。

对于我自己以及未来的其他人,能否解释一下支持 任意大小整数 的 BigInt 的数据模型是什么样的?基本上,什么是对象及其属性。我知道所有算术 functions 都以独特的方式为 BigInt 实现,但我看不到 kernel 是什么。 BigInt结构的本质是什么?也许 this one 会更容易理解。

A BigInt 的工作原理与你在学校学到的整数完全一样,除了 "digits" 不是基于 10 个符号,它们基于 4294967296(或 18446744073709551616,或专门用于 ECMAScript 9007199254740991) .

数据模型的内核只是一个 "digits" 的列表,它们本身是固定大小的整数和一个符号位(或者,第一个 "digit" 本身是有符号的)。其他一切都是性能优化。

在伪代码中,它看起来像这样:

record BigInt
    sign: boolean
    digits: sequence[unsigned_integer]

或者这个:

record BigInt
    first_digit: signed_integer
    digits: sequence[unsigned_integer]

同样,如果你写下一个以 10 为底的整数,你将它写成一个数字序列和一个符号,即写当前年份,你会写:20, 1, 9, 表示(从右到左)

  9 * 10^0 =    9
+ 1 * 10^1 =   10
+ 0 * 10^2 =  000
+ 2 * 10^3 = 2000
             ====
             2019

或者,也许你会写 7E3,表示(从右到左)

  3_16 * 10_16^0
+ E_16 * 10_16^1
+ 7_16 * 10_16^2

相同
  3_16 * 16_10^0
+ E_16 * 16_10^1
+ 7_16 * 16_10^2

相同
   3_10 * 16_10^0 =    3_10
+ 14_10 * 16_10^1 =  224_10
+  7_10 * 16_10^2 = 1792_10
                    =======
                    2019_10

并且 BigInt 中的表示方式与 完全相同,除了基数(大得多)。