【发布时间】:2015-03-21 06:21:00
【问题描述】:
在 javascript 中,使用“整数”参数除以零的行为类似于浮点应该:
1/0; // Infinity
-1/0; // -Infinity
0/0; // NaN
asm.js 规范说,带整数参数的除法返回intish,必须立即强制转换为有符号或无符号。如果我们在 javascript 中执行此操作,使用“整数”参数除以零在强制转换后总是返回零:
(1/0)|0; // == 0, signed case.
(1/0) >> 0; // == 0, unsigned case.
但是,在 Java 和 C 等具有实际整数类型的语言中,将整数除以零是错误的,并且执行会以某种方式停止(例如,引发异常、触发陷阱等)。
这似乎也违反了 asm.js 指定的类型签名。 Infinity 和 NaN 的类型是 double 和 / 应该是(来自规范):
(签名,签名)→ intish ∧ (无符号,无符号)→ intish ∧ (double?, double?) → double ∧ (浮动?,浮动?)→浮动
但是,如果其中任何一个的分母为零,则结果为double,因此类型似乎只能是:
(双倍?,双倍?) → 双倍
asm.js 代码中预期会发生什么?它遵循javascript并返回0还是被零除会产生运行时错误?如果它遵循javascript,为什么输入错误可以?如果它产生运行时错误,为什么规范没有提到它?
【问题讨论】:
标签: javascript asm.js