需要JavaScript/ecma262到NT32算法的解释

需要JavaScript/ecma262到NT32算法的解释,javascript,math,bit-manipulation,bitwise-operators,integer-arithmetic,Javascript,Math,Bit Manipulation,Bitwise Operators,Integer Arithmetic,我试图理解JS引擎如何将JS数字(Float64)转换为32位有符号整数。我了解到可以通过按位或类似方式将64位浮点快速转换为32位有符号整数: -8589934590 | 0 // which gives 2 我不明白这两个是从哪里来的。根据,ToInt32算法可以做到这一点(粗体文本是我的,而不是规范的): 让数字成为现实吧?ToNumber(参数):-8589934590已经是一个数字了 如果数字为NaN,+0,-0+∞, 或-∞, 返回+0.:否 设int为与Number相同符号且其大

我试图理解JS引擎如何将JS数字(Float64)转换为32位有符号整数。我了解到可以通过按位或类似方式将64位浮点快速转换为32位有符号整数:

-8589934590 | 0 // which gives 2
我不明白这两个是从哪里来的。根据,ToInt32算法可以做到这一点(粗体文本是我的,而不是规范的):

  • 让数字成为现实吧?ToNumber(参数):-8589934590已经是一个数字了
  • 如果数字为NaN,+0,-0+∞, 或-∞, 返回+0.:
  • 设int为与Number相同符号且其大小为floor(abs(Number))的数值:-8589934590已经是整数
  • 设INT32位为int模2²,因为2²为正,所以结果也应为正。在JS中,余数运算符使用左操作数的符号,因此为了在这种情况下获得模(其中-8589934590为负),我们对其求反:
    让int32bit=8589934590%2**32//4294967294,其32位长度为0B11111111110
  • 如果INT32位≥ 2Ω,返回INT32位-2²;否则返回int32位int32bit小于2英寸(因为它是负数),所以我使用
    int32bit
    ,它等于
    -2
    即使我们考虑
    0B11111111111110
    一个无符号整数,它也大于2英寸,而int32bit-2英寸仍然等于
    -2

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

    您的步骤4是错误的。规范将模定义为:

    符号“x模y”(y必须是有限的且非零)计算与y(或零)符号相同的值k,使得对于某些整数q,abs(k) 所以-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).

    @jonaswillms据我所知,由于模给出右操作数的符号,%给出左操作数的符号,它们可以用来相互替换,但要小心。据我所知,myNegativeVar%positiveInt是等效的