有人可以解释为什么Javascript会给出以下结果吗?
~3 = -4
~3.346346 = -4
~-3 = 2
答案 0 :(得分:3)
~
是 bitwise negation operator[MDN] 。
3
(使用32位整数)是
0000 0000 0000 0000 0000 0000 0000 0011 (3)
二进制中的和-3
(使用two's complement)是
1111 1111 1111 1111 1111 1111 1111 1101 (-3)
~
运算符将所有1
转换为0
,将0
转换为1
,因此~3
将是
1111 1111 1111 1111 1111 1111 1111 1100 (~3 == -4)
是-4
的二进制文件(使用two's complement)。
同样,~-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
答案 1 :(得分:0)
这是因为负数存储为二的补码:
minusB = ~B + 1;
在您的情况下,撤消上面的公式:
-3
存储为~3 + 1
。因此,~-3
相当于-(-3) - 1 = 2
。~3.346346
首先四舍五入为3
,然后~3
可以读为-3 - 1 = -4
使用二进制补码的原因(而不是使用单独的符号位),无论符号如何,它都会使减法和加法变得微不足道。