【问题标题】:How do I emulate x86 unsigned 32-bit integer multiplication using JavaScript?如何使用 JavaScript 模拟 x86 无符号 32 位整数乘法?
【发布时间】:2012-08-19 12:39:42
【问题描述】:

使用 Emscripten 编译此代码:

#include <stdio.h>
int main() {
unsigned long d1 = 0x847c9b5d;
unsigned long q =  0x549530e1;
printf("%lu\n", d1*q);
return 0;
}

产量(使用-g):

  $d1=-2072208547; //@line 3 "minusmul.c"
  $q=1419063521; //@line 4 "minusmul.c"
  var $2=$d1; //@line 5 "minusmul.c"
  var $3=$q; //@line 5 "minusmul.c"
  var $4=((($2)*($3))|0); //@line 5 "minusmul.c"

使用js(我相信是SpiderMonkey?)或node执行此操作,我得到3217488896的结果。执行本机可执行文件(使用 GCC 编译),我得到 3217489085。如何使用 JavaScript 模拟 x86 无符号 32 位整数乘法?

【问题讨论】:

标签: javascript x86 unsigned emulation emscripten


【解决方案1】:

Javascript 使用 IEEE-754 标准 (see also) 作为其内部数字表示。这是浮点运算,因此您将不得不提出自己的库函数来模拟大整数的按位运算。存在多个库,例如 BigIntBigNumber

【讨论】:

  • 单精度浮点数可以表示 0 到 2^32-1 AFAIK 之间的所有数字,所以我看不出我需要 BigInts 做什么。
  • 关于这个话题的讨论很多。见stackoverflow.com/questions/307179/…
【解决方案2】:

Emscripten 要么不支持精确的 32 位乘法,要么就是一个错误。由于他们在主页上提到他们有 64 位数学的软件仿真,我认为这是一个错误。我发现你可以使用 CHECK_OVERFLOWS 并且它会发现溢出。它似乎并没有“修复”它。要使程序以 CHECK_OVERFLOWS 结束,您需要增加计数,在生成的源代码中标记为“XXX”。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-07-27
  • 2014-05-15
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 2015-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多