0

有人可以解释为什么 Javascript 会给出以下结果吗?

~3 = -4
~3.346346 = -4
~-3 = 2
4

2 回答 2

4

~按位否定运算符[MDN]

3二进制(使用 32 位整数)是

0000 0000 0000 0000 0000 0000 0000 0011 (3)

并且-3在二进制中(使用二进制补码)是

1111 1111 1111 1111 1111 1111 1111 1101 (-3)

运算符将所有s~反转为s 并将所有s 反转为,因此将是1001~3

1111 1111 1111 1111 1111 1111 1111 1100 (~3 == -4)

这是二进制的-4(使用二进制补码)。

同样,~-3

0000 0000 0000 0000 0000 0000 0000 0010 (~-3 == 2)

这是二进制的2

3.346346在进行按位运算时将被强制转换为整数,因此它的结果与3之前相同。


总结一下:

  3 = 0000 0000 0000 0000 0000 0000 0011 = (int)3.346346
 ~3 = 1111 1111 1111 1111 1111 1111 1100 = -4
 -3 = 1111 1111 1111 1111 1111 1111 1101
~-3 = 0000 0000 0000 0000 0000 0000 0010 =  2
于 2014-01-09T22:55:58.227 回答
0

这是因为负数存储为二进制补码

minusB = ~B + 1;

在您的情况下,颠倒上面的公式:

  • -3存储为~3 + 1. 所以,~-3等价于-(-3) - 1 = 2
  • ~3.346346首先四舍五入为3,然后~3可以读为-3 - 1 = -4

之所以使用二进制补码(而不是使用单独的符号位),是因为它使减法和加法变得微不足道,而不管符号如何。

于 2014-01-09T22:48:48.777 回答