【问题标题】:JavaScript integer shift safety: (n << 1) != (n * 2)JavaScript 整数移位安全: (n << 1) != (n * 2)
【发布时间】:2017-02-14 08:41:30
【问题描述】:

挖掘 JS 对我来说刚刚发现了一些新东西:

n = 0xffffffff
4294967295
n
4294967295
n << 1
-2
n * 2
8589934590
(n << 1) == (n * 2)
false
n + 1
4294967296

这是内置 FireFox(51.0.1 64 位)调试器的控制台输出...

到目前为止,我所阅读的内容(w3school 等)不允许我怀疑这种行为。

没问题还是我错过了什么?

...To be continued...

【问题讨论】:

  • 位运算符(> >>> | & 等)仅限于(有符号)32 位

标签: javascript integer integer-overflow


【解决方案1】:

n &lt;&lt; bhandles n and the result as int 32,而n * 2 handles n and the 2number

请注意,4294967295 &lt;&lt; 0 将是 -1

【讨论】:

    【解决方案2】:

    在 javascript 中,右移运算符或左移运算符仅支持 32 位。 2 ^32 - 1 = 4294967295。

    【讨论】:

      【解决方案3】:

      第一条评论回答了这个问题:位运算是 32 位签名的

      数学 看起来要长得多:

      var n = 0xffffffff;
      // loop over 1P:
      for(var i=1; i<=1024*1024*1024*1024; i*=16) {
          var v=(n*i).toString(16);
          console.log('i='+i+'; v='+v+' ('+v.length*4+')');
      }
      // Output:
      // i=1; v=ffffffff (32) 
      // i=16; v=ffffffff0 (36) 
      // i=256; v=ffffffff00 (40) 
      // i=4096; v=ffffffff000 (44) 
      // i=65536; v=ffffffff0000 (48) 
      // i=1048576; v=ffffffff00000 (52) 
      // i=16777216; v=ffffffff000000 (56) 
      // i=268435456; v=ffffffff0000000 (60) 
      // i=4294967296; v=ffffffff00000000 (64) 
      // i=68719476736; v=ffffffff000000000 (68) 
      // i=1099511627776; v=ffffffff0000000000 (72)
      // i=17592186044416; v=ffffffff00000000000 (76) 
      // i=281474976710656; v=ffffffff000000000000 (80)
      

      即至少有 80 位可用...嘿嘿!

      你很快就会得到一个“不可变数字”!

      n=0xffffffffffffffff // 64-bit wanted
      18446744073709552000 // what? even decimal for odd hex?
      n.toString(16)
      "10000000000000000" // ooops...
      n-1
      18446744073709552000
      n-2
      18446744073709552000
      n-4
      18446744073709552000
      

      看起来应该是一个单独的问题......

      【讨论】:

        猜你喜欢
        • 2017-08-30
        • 2015-10-08
        • 2011-01-29
        • 2017-10-03
        • 2015-08-13
        • 1970-01-01
        • 2022-11-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多