问题 JavaScript中为什么~5 === -6? [重复]


这个问题在这里已有答案:


5903
2018-05-12 23:01


起源

到这里: stackoverflow.com/questions/31377474/... - Evan_K2014
所有使用双补码系统的计算机都是相同的负数 - Soren
~x === - (x + 1):-) .. - choz
Javascript标签似乎倾向于“{crazy expression A} {comparison} {crazy expression B}?”品种... - Timothy Shields
我喜欢你把它称为“Javascript”:D - papiro


答案:


它确实执行了一个不正确的NOT,负数是在 两个补充。所以价值 1010 是 -6

二进制补码基本上由最左边的位表示负数而被视为负值。所有其他1位都添加到此数字。例如:

1010 => (-8 +0 +2 +0) => -6
1111 => (-8 +4 +2 +1) => -1

3
2018-05-12 23:14





为什么按位“不是1”等于-2? 是一样的想法。
Cerebrus在上面链接中的答案(BINARY R - > L):
1和-2:0和-1之间有2个整数

二进制1是00000000000000000000000000000001
二进制0是00000000000000000000000000000000
二进制-1是11111111111111111111111111111111
二进制-2是11111111111111111111111111111110
(“二进制”是2的补码,在按位的情况下不是〜)


2
2018-05-12 23:14



我理解(我认为)。对我来说,1将是 001 和-2将是 110 这是1,其位反转。但简单地反转这些位似乎不会将5变为-6。 - papiro
我现在看到了我的困惑!最左边的位不仅用于指示符号,还用于计算负数中的某些内容。所以 110 看着我像负二零,但实际上是(-4)-2-0加起来是-2!棘手的棘手 - papiro


通过意识到第一位是符号,你已经非常接近解决方案,但是,其余的位不是“原样”使用的。实际上,在计算中,带符号的数字用二进制补码表示。

有关于这个概念的详细文章 维基百科 和其他各种网站一样,但简而言之,当第一位为1(表示负数)时,其余位构成一个数字,基本上显示您添加到最小数字的数量(例如,在8位整数中)最小值是-256 11111111所以反转5(00000101)成为 11111010 或250,所以你可以通过添加250到-256得到小数,你得到-6)。这个解释是对十进制系统的简化,但是为了充分理解它是如何工作的,你应该真正阅读关于二进制补码的整篇文章。


2
2018-05-12 23:16





你被标志位和放置位置弄糊涂了....

扩展位数(例如,非常短的8位int)并查看

00000110 6

位反转〜

00000101 5
11111010 ~5 (bitwise inversion of 5)

从零开始倒计时

00000000 0
11111111 -1
11111110 -2
11111101 -3
11111100 -4
11111011 -5
11111010 -6

所以

11111010 -6

11111010 ~5

是一样的。

这是真的 不仅适用于JavaScript,还适用于基于2个补码系统的计算机上运行的任何内容 - 不确定JavaScript是否曾运行过任何其他内容:-)


2
2018-05-12 23:22