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

时间:2012-08-23 22:51:48

标签: 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;
}

收益率(使用-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位整数乘法?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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