Thank you. My apologies to the v8 crowd for not understanding that this is a Javascript issue.
I'm gonna have to figure out how to file this away, because it bothers me so. ;) -LLeo On Saturday, February 9, 2013 2:09:47 PM UTC-5, Jakob Kummerow wrote: > > On Sat, Feb 9, 2013 at 2:32 AM, Leo Lunatic <[email protected]<javascript:> > > wrote: > >> Given: >> a=0x80000000 >> b=0x80000000>>0 >> c=0x80000000>>>0 >> we find >> a !== b >> but >> a === c >> and this is LOVELY! >> a !== ~~a >> >> I realized this is probably and artifact of the optimizations we know and >> love, >> > > It's an artifact of the JavaScript language specification, which we all > know and, uh, ... > > All numbers in JavaScript are doubles, and generally signed. The bitwise > operators, however, have "truncation to int32" semantics. So in your > example, "~a" converts the double 2147483648.0 (which you got by typing > 0x80000000) to integer, resulting in the bit pattern 0x80000000, then flips > all bits. The result is the bit pattern 0x7FFFFFFF. When evaluating "~~a", > the same is now performed again, and the result is the *bit pattern* > 0x80000000, which when interpreted as a signed int32 and converted back to > double is -2147483648.0. Now when you compare 2147483648.0 > and -2147483648.0, of course they're not the same! > The same explanation holds for "a >> 0", which has signed semantics. "a > >>> 0" behaves differently, because it has unsigned semantics, i.e. it > interprets both its input and its output as unsigned 32-bit integers. (If > ">>" and ">>>" did the same thing, then what would be the point in having > both?) > > but when commutativity and identity are messed with it's feels like cats >> and >> dog living together; you know, end of the world stuff :). >> > > Nothing is messed with. The JavaScript bitwise operators perform an > implicit conversion, and then a bitwise operation. Even if the latter is > involutary, applying the operator twice does not undo the former. So the > operator as a whole is an involution if the conversion is a no-op, which > means "a === ~~a" is true if and only if "a" contains a valid signed int32 > value. > > Bit patterns are hard. So are dynamically typed languages. Let's go > shopping. > > >> >> Be warned if you aren't already. >> >> G'day, >> -LLeo >> >> P.S. If you have trouble visualizing the bits printf("0b%032b", ...) is >> your >> friend. https://github.com/wdavidw/node-printf (works in browsers). >> >> -- >> -- >> v8-users mailing list >> [email protected] <javascript:> >> http://groups.google.com/group/v8-users >> --- >> You received this message because you are subscribed to the Google Groups >> "v8-users" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected] <javascript:>. >> For more options, visit https://groups.google.com/groups/opt_out. >> >> >> > > -- -- v8-users mailing list [email protected] http://groups.google.com/group/v8-users --- You received this message because you are subscribed to the Google Groups "v8-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/groups/opt_out.
