【问题标题】:Why does ~0 is -1?为什么〜0是-1?
【发布时间】:2012-06-13 20:15:07
【问题描述】:

所以我是reading about ~,

对每个位执行 NOT 运算符。

所以我尝试了:

 0 = 00000000000000000000000000000000

         so ~0 should be

~0 = 11111111111111111111111111111111

但是当我尝试时,它返回-1。 11111111111111111111111111111111不是十进制的4294967295吗?

【问题讨论】:

标签: javascript math binary


【解决方案1】:

它被解释为有符号整数,在二进制补码中,所有位为 1 的整数是-1。

【讨论】:

  • 所以当你把4294967295转成二进制再转回十进制时,它会变成-1?
  • 可能值得添加 - 在二进制补码中,所有位都具有与无符号值相同的值,除了最重要的值。最高有效位 (MSB) 的值相对于无符号值中的同一位被否定 - 例如对于 32 位整数,二进制补码的 MSB 值为 -2147483648,而无符号整数的 MSB 值为 +2147483648。
  • 这取决于使用的语言和类型,@Derek。如果我没记错 Javascript 的行为,如果您输入 4294967295,它将被视为 number 并在内部表示为 double,因此不会自动转换为 -1。但是如果你对它进行位操作,它会被转换成一个(有符号的)32位整数,然后位模式被解释为-1。
  • 没有将值“转换”为二进制的事情——二进制是计算机中所有内容的存储方式——其余的只是为了我们的方便。对于 x86 处理器,关于二进制补码的位具有与正侧相同的位值是不正确的,它们没有被添加并且添加了一个。否则怎么可能所有位都设置为 -1?
【解决方案2】:

仅当类型为无符号时。有符号整数使用最高位作为否定标志 - 因此将其设置为 1 会导致负数。见Two's Complement。

【讨论】:

    【解决方案3】:

    所有1s 的位模式是4294967295,用于无符号整数或超过32 位 的有符号整数。对于具有 32 位 的有符号整数,表示为 二的补码,它的 -1。

    【讨论】:

      猜你喜欢
      • 2012-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      • 1970-01-01
      相关资源
      最近更新 更多