4

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 ビット整数の乗算をどのようにエミュレートしますか?

4

2 に答える 2

1

Javascript は、内部数値表現としてIEEE-754標準 (も参照) を使用します。これは浮動小数点演算であるため、大きな整数に対してビット単位の演算をエミュレートするには、独自のライブラリ関数を考え出す必要があります。BigIntBigNumberなど、いくつかのライブラリが存在します。

于 2012-08-23T23:40:02.917 に答える
1

Emscripten は正確な 32 ビット乗算をサポートしていないか、バグです。彼らはホームページで 64 ビット演算用のソフトウェア エミュレーションがあると述べているので、これはバグだと思います。CHECK_OVERFLOWS を使用できることを発見しました。これにより、オーバーフローが検出されます。しかし、それを「修復」するわけではないようです。プログラムを CHECK_OVERFLOWS で終了させるには、生成されたソースで「XXX」でマークされたカウントを増やす必要があります。

于 2012-08-24T04:20:32.000 に答える