需要JavaScript/ecma262到NT32算法的解释
我试图理解JS引擎如何将JS数字(Float64)转换为32位有符号整数。我了解到可以通过按位或类似方式将64位浮点快速转换为32位有符号整数:需要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相同符号且其大
-8589934590 | 0 // which gives 2
我不明白这两个是从哪里来的。根据,ToInt32算法可以做到这一点(粗体文本是我的,而不是规范的):
让int32bit=8589934590%2**32//4294967294,其32位长度为0B11111111110
int32bit
,它等于-2
(即使我们考虑0B11111111111110
一个无符号整数,它也大于2英寸,而int32bit-2英寸仍然等于-2
请有人解释一下,我是否正确理解ToInt32算法和按位OR运算符?您的步骤4是错误的。规范将模定义为: 符号“x模y”(y必须是有限的且非零)计算与y(或零)符号相同的值k,使得对于某些整数q,abs(k)
因此,对于负数x和正数y,q*y总是会得到一个比x小的数,k才是正数。因此,如果我们将其转换为正数(就像你所做的那样),我们会寻找该数的大倍数,而不是小倍数。例如,如果我们取2%3,则返回2(2-2=3*0),而-2模3将返回1(-2-1=3*-1).@jonaswillms据我所知,由于模给出右操作数的符号,%给出左操作数的符号,它们可以用来相互替换,但要小心。据我所知,myNegativeVar%positiveInt是等效的