Javascript:这是一个真正签名的整数部门

lcm*_*lin 10 javascript integer integer-division ecmascript-6

给出下面的代码,其中两个abNumber表示符号的32位带符号整数的范围内的值S:

var quotient = ((a|0) / (b|0))|0;
Run Code Online (Sandbox Code Playgroud)

并且假设运行时完全符合ECMAScript 6规范,那么值是否quotient 始终是正确的有符号整数除a以及b整数?换句话说,这是一种在JavaScript中实现真正有符号整数除法的正确方法,它等同于机器指令吗?

gen*_*kev 5

我不是浮点数的专家,但维基百科说双打有52位的精度.从逻辑上讲,似乎52位应足以可靠地逼近32位整数的整数除法.

划分最小和最大32位有符号整数-2147483648 / 2147483647,产生-1.0000000004656613,这仍然是一个合理的有效数字量.2147483647 / -2147483648它产生的反转也是如此-0.9999999995343387.

一个例外是除零,我在评论中提到过.正如链接的SO问题所述,整数除零通常会引发某种错误,而浮点强制导致(1 / 0) | 0 == 0.

更新:根据另一个SO答案,C中的整数除法截断为零,这就是|0JavaScript中的做法.除此之外,除以0是未定义的,因此JavaScript在返回零时在技术上并不正确.除非我错过任何其他内容,否则原始问题的答案应该是肯定的.

更新2:如何:ECMAScript的6规范的有关章节划分数,以及如何转换为32位有符号整数,这是什么|0.