例如,
int result;
result = 125/100;
Run Code Online (Sandbox Code Playgroud)
要么
result = 43/100;
Run Code Online (Sandbox Code Playgroud)
结果总会成为师的底线吗?什么是定义的行为?
在javascript中,使用"整数"参数除零就像浮点一样:
1/0; // Infinity
-1/0; // -Infinity
0/0; // NaN
Run Code Online (Sandbox Code Playgroud)
asm.js规范说,返回带有整数参数的除法intish,必须立即强制转换为有符号或无符号.如果我们在javascript中执行此操作,则使用"整数"参数除零始终在coersion后返回零:
(1/0)|0; // == 0, signed case.
(1/0) >> 0; // == 0, unsigned case.
Run Code Online (Sandbox Code Playgroud)
但是,在具有Java和C等实际整数类型的语言中,将整数除以零是一个错误,执行会以某种方式停止(例如,抛出异常,触发陷阱等).
这似乎也违反了asm.js指定的类型签名.的类型的Infinity和NaN是double与/是假想(从规格):
(签名,签名)→intish∧(无符号,无符号)→intish∧(double?,double?)→double∧(float?,float?)→floatish
但是,如果其中任何一个具有零分母,结果是double,所以看起来类型只能是:
(双?,双?)→双
在asm.js代码中会发生什么?它是否遵循javascript并返回0或除零产生运行时错误?如果它遵循javascript,为什么键入错误是正确的?如果它产生运行时错误,为什么规范没有提到呢?