有人可以解释为什么 Javascript 会给出以下结果吗?
~3 = -4
~3.346346 = -4
~-3 = 2
~
是按位否定运算符[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 反转为,因此将是1
0
0
1
~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
这是因为负数存储为二进制补码:
minusB = ~B + 1;
在您的情况下,颠倒上面的公式:
-3
存储为~3 + 1
. 所以,~-3
等价于-(-3) - 1 = 2
。~3.346346
首先四舍五入为3
,然后~3
可以读为-3 - 1 = -4
之所以使用二进制补码(而不是使用单独的符号位),是因为它使减法和加法变得微不足道,而不管符号如何。