我想确定一下我在JavaScript数字处理方面的知识不足之处。 JS处理shift left运算符的方式显示了这个差距。
我的理解是,在JavaScript中,“所有的数字都是浮点数”。 但这并不适合位移位运算符,而且实际上,可演示的行为还告诉我,这比我意识到的还要多。
我检查了这里的规范:位移位运算符,它所说的(在这一点上)是
左移位运算符(<<)按右操作数指定的量对左操作数执行按位左移位操作。
但是如果所有的数字都以浮点格式表示,那么从字面上看,这意味着我们将移位尾数和指数的位表示,当指数位移到尾数位时,将得到总的无意义值。 所以,我的下一个想法是,也许它只是取尾数部分,把它移位,然后放回原处。 但情况似乎也并非如此,因为2.5<<<; 1是4,不是5。
我还发现,任何一个指数值很大的数字似乎都会产生零。
因此,从这个简短的检查中,我猜测系统实际上取数,执行转换,即“斩除32位2的补码整数值”,然后对其进行移位,然后将所得的int转换回浮动表示形式。 (除非我一开始就被骗了“所有的数字都是浮动的”!)
谁能告诉我:
a)关于“所有数字都是浮点数”的事情我是不是被骗了?b)如果我对“转换到int,shift,然后转换回”行为的猜测是正确的,那么在哪里有文档记录。我不得不相信它在规范中,但它是一个很大的问题,虽然我搜索了一些,但我没有读过所有的内容(如果我能得到提示的话,我也不是特别想读!)
它可以在抽象操作number::leftshift
中找到:
而ToInt32基本上执行:
设int32bit为整数模232。
所以左移仍然是在64位浮点数上进行的,但是上面的32位在运算前被截断。