« 入社しました | メイン | md5.js »

論理演算1

JavaScript(JS)の勉強を始めて最初にひっかかったのは整数の挙動です.
JSでは整数は内部64bit浮動小数として扱われますが,論理演算をするときに限り符号つき32bit整数に変換されます.
C++プログラマからすると,「符号つき」が曲者です.
たとえばJSでは
x = 0xee6b28004;/* =4e9 */
は正の整数
x == 4000000000であるため,uint32相当と思いがちです.しかしその場合,
x &= 0xffffffff;
とした瞬間にxは「符号つき」と扱われ,
x == -294967296;
と負の整数になってしまうことを忘れてしまうかもしれません.

また,JSで厳密に扱える整数の最大値は
0x20000000000000 = 9007199254740992;
ですが,これを1 << 53として作ろうとすると,32bitでラップアラウンドするため,
1 << 53 = 1 << (53 - 32) = 1 << 20 = 1048576;
になります.

x | 0やx >> 0など,通常変化しないと思ってしまいがちな処理でも符号つき32bit整数への変換が行われるため,注意が必要です.
#(4000000000 | 0) < 0

なお,特別な値NaNについては
NaN | 0 == 0
NaN >> 0 == 0
となるため,0として扱われるようです.

cf.
http://developer.mozilla.org/ja/docs/Core_JavaScript_1.5_Guide:Operators:Bitwise_Operators

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)