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 为底的整数,你将它写成一个数字序列和一个符号,即写当前年份,你会写:2
,0
, 1
, 9
, 表示(从右到左)
9 * 10^0 = 9
+ 1 * 10^1 = 10
+ 0 * 10^2 = 000
+ 2 * 10^3 = 2000
====
2019
或者,也许你会写 7
、E
、3
,表示(从右到左)
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
在 中的表示方式与 完全相同,除了基数(大得多)。
我看到 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 为底的整数,你将它写成一个数字序列和一个符号,即写当前年份,你会写:2
,0
, 1
, 9
, 表示(从右到左)
9 * 10^0 = 9
+ 1 * 10^1 = 10
+ 0 * 10^2 = 000
+ 2 * 10^3 = 2000
====
2019
或者,也许你会写 7
、E
、3
,表示(从右到左)
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
在 中的表示方式与 完全相同,除了基数(大得多)。