如何使用JavaScript模拟x86无符号32位整数乘法?

如何使用JavaScript模拟x86无符号32位整数乘法?,javascript,x86,unsigned,emulation,emscripten,Javascript,X86,Unsigned,Emulation,Emscripten,使用Emscripten编译此代码: #include <stdio.h> int main() { unsigned long d1 = 0x847c9b5d; unsigned long q = 0x549530e1; printf("%lu\n", d1*q); return 0; } 使用js(我相信是SpiderMonkey?)或node执行此操作,我得到的结果是3217488896。执行本机可执行文件(使用GCC编译),我得到3217489085。如何使用JavaSc

使用Emscripten编译此代码:

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

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

JavaScript使用标准()作为其内部数字表示形式。这是浮点运算,所以您必须拿出自己的库函数来模拟大整数的按位运算。存在多个库,如和。

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

单精度浮点可以表示0到2^32-1之间的所有数字,因此我不知道需要大整数的原因。关于这个主题有很多讨论。请看我在网站上发布的答案的副本。好的,原来是个bug,
  $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"