我试图了解JS引擎如何将JS数字(Float64)转换为32位有符号整数。我读到,可以快速将64位浮点数转换为32位有符号整数,按位或如下所示:
-8589934590 | 0 // which gives 2我不明白2是从哪里来的。根据等级库,ToInt32算法是这样做的(粗体文本是我的,而不是规范的):
let int32bit = 8589934590 % 2**32 // 4294967294 which has 32 bit length 0b11111111111111111111111111111110。int32bit ,它等于 -2 (即使我们考虑 0b11111111111111111111111111111110 E 130一个无符号整数,那么它就更大了2和<代码>E 231<代码>E 132it 32位<代码>E 233<代码>E 134-2仍然等于E 235d36请有人解释一下,我是否正确地理解了ToInt32算法和按位或运算符?
发布于 2020-10-28 18:38:08
你的第四步错了。规范将模块定义为:
符号“x模y”(y必须是有限的和非零的)计算与y(或零)相同符号的值k,使得abs(k) < abs(y)和x= q×y对某些整数q。
所以-8589934590是我们的x,2**32是我们的y,由此我们也知道k必须是正的。如果我们选择q= -1,则可以将方程解为k= -4294967294。然而,这不是一个有效的解,因为k(负)与y(正)没有相同的符号。如果选择q= -2,则得到k= 2。
因此,对于负数x和正数y,q*y总是必须得到比x更小的数,这样k才是正的。因此,如果我们将其转换为正数(就像您所做的那样),我们将寻找这个数字的较大倍数,而不是较小的倍数。例如,如果取2% 3,则返回2 (2 -2 =3* 0),而-2模3返回1 (-2 -1 =3* -1)。
https://stackoverflow.com/questions/64578357
复制相似问题