有没有人遇到过关于 int 和 uint 算术如何在 Actionscript 3 中工作的权威规范?(“权威”是指“来自 Adobe”或“已被 Adobe 宣布为权威”)。特别是我正在寻找一种受支持的方式来进行整数乘法模 2 32。这在我能找到的任何 Adobe 文档中都没有涉及。
Actionscript 声称基于 ECMAScript,但 ECMAScript 根本不做整数运算。它在 IEEE-754 上执行所有操作加倍,并在按位运算之前将结果模 2 32减少,这在大多数情况下模拟整数运算。但是,这不适用于乘法:乘法的真实结果,例如 0x10000001 * 0x0FFFFFFF 对于双精度数的尾数来说太长了,因此如果严格遵守规范,低位将丢失。
现在输入 Actionscript。我通过实验int
发现,将两个或变量相乘uint
并立即将产品转换为int
或uint
似乎总是给我确切的结果。但是,生成的 AVM2 字节码只包含一个普通的“mul”指令,没有直接指示它应该产生一个整数结果而不是浮点结果;虚拟机必须向前看才能发现这一点。我担心我只是在实验中很幸运,并且获得了额外的精度作为奖励,而不是我可以依赖的东西。
(一方面,我的实验都是使用 x86 Flash 播放器进行的。也许它代表英特尔 80 位加倍的中间结果,或者将 64 位 int 存储在评估堆栈上,直到知道它将用于什么。两者都没有在没有本机 32×32→64 乘法指令的非 x86 平板电脑上很容易实现,所以 VM 可能只是决定将精度降低到 ECMAScript 标准指定的精度吗?)
24 小时状态: Mike Welsh 进行了一些有能力的调查并提供了非常有用的链接,但不幸的是还不足以关闭问题。还有谁?
(tl;博士评论中的辩论:whitequark 在某种程度上驳斥了我的假设原因之一,为什么答案可能是“否”。他的观点是有道理的,但当然不构成答案是“是”的证明)。