首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要对JavaScript/ecma262 262 ToInt32算法进行解释

需要对JavaScript/ecma262 262 ToInt32算法进行解释
EN

Stack Overflow用户
提问于 2020-10-28 17:37:57
回答 1查看 186关注 0票数 2

我试图了解JS引擎如何将JS数字(Float64)转换为32位有符号整数。我读到,可以快速将64位浮点数转换为32位有符号整数,按位或如下所示:

代码语言:javascript
复制
-8589934590 | 0 // which gives 2

我不明白2是从哪里来的。根据等级库,ToInt32算法是这样做的(粗体文本是我的,而不是规范的):

  1. 让号码是?ToNumber(参数):-8589934590已经是一个数字
  2. 如果数字为NaN,+0,-0,+∞或-∞,则返回+0。:No
  3. 设int是与数字相同的数字值,其大小为零(abs(数字)):-8589934590已经是一个整数
  4. 让int32bit是整数模2立方,因为2立方米是正的,结果也应该是正的。在JS中,余数运算符使用左操作数的符号,因此为了获得一个模(在本例中-8589934590是负的),我们否定它: let int32bit = 8589934590 % 2**32 // 4294967294 which has 32 bit length 0b11111111111111111111111111111110
  5. 如果int32bit≥2为1,则返回int32bit -2平方千米;否则返回int32bit。int32bit是较小的2(因为它是负的),所以我使用 int32bit ,它等于 -2 (即使我们考虑 0b11111111111111111111111111111110 E 130一个无符号整数,那么它就更大了2和<代码>E 231<代码>E 132it 32位<代码>E 233<代码>E 134-2仍然等于E 235d36

请有人解释一下,我是否正确地理解了ToInt32算法和按位或运算符?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64578357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档