JavaScriptの<<とMath.powの違い

投稿者 nanki 2010-05-18 22:26:00 GMT

某所で話題になったのでまとめ。

JavaScriptで、

200 << 24
=> -939524096

200 * Math.pow(2, 24)
=>3355443200

の結果が違うという話。

200 が 7~8bitなので、すぐに32bitの壁だとわかるが、これは仕様なのか、実装によるものなのか。

ECMA-262, p.76

  1. Let lref be the result of evaluating ShiftExpression.
  2. Let lval be GetValue(lref).
  3. Let rref be the result of evaluating AdditiveExpression.
  4. Let rval be GetValue(rref).
  5. Let lnum be ToInt32(lval).
  6. Let rnum be ToUint32(rval).
  7. Let shiftCount be the result of masking out all but the least significant 5 bits of rnum, that is, compute rnum & 0x1F.
  8. Return the result of left shifting lnum by shiftCount bits. The result is a signed 32-bit integer.

つまり、

(signed int32)(ToInt32(200) << (ToUint32(24) & 0x1F))

こういう感じになる。

結果は32bit符号付き整数なので、こうなるのは仕様。

参考:

This entry was posted on 2010-05-18 22:26:00 GMT and カテゴリ . You can follow any response to this entry through the Atom feed. or a trackback from your own site.

タグ


トラックバック

トラックバックリンク:
http://blog.netswitch.jp/trackbacks?article_id=8662