为什么 ~0 等于 -1?

5

当我阅读关于~的内容时,

对每个位执行NOT运算符。

所以我尝试了:

 0 = 00000000000000000000000000000000

         so ~0 should be

~0 = 11111111111111111111111111111111

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


1
为什么无符号整数 unsigned int x = 1 和有符号整数 int y = 0 有相同的二进制表示? - copy
@copy - 它是用 C 写的,不是 JavaScript。 - Derek 朕會功夫
4
这是适用于大多数编程语言的基础知识。请阅读http://en.wikipedia.org/wiki/Two%27s_complement 或 https://dev59.com/gnA75IYBdhLWcg3wuLnD#3141181。 - copy
3个回答

9

这里的内容是有符号整数,在二进制补码中,所有位都是1的整数被解释为-1


当你将 4294967295 转换为二进制,然后再转换回十进制,它会变成 -1 吗? - Derek 朕會功夫
1
可能值得添加的是,在二进制补码中,除了最高位之外,所有位的值都与无符号值相同。最高位(MSB)相对于无符号值中的同一位其值被取反 - 例如,对于32位整数,对于二进制补码而言,MSB的值为-2147483648,而不是无符号值的+2147483648。 - user180247
1
这取决于所使用的语言和类型,@Derek。如果我记得正确的话,JavaScript 的行为是,如果你输入 4294967295,它将被视为一个 number 并在内部表示为一个 double,因此它不会自动转换为 -1。但如果你对它进行位运算,它将被转换为(有符号的)32 位整数,然后位模式将被解释为 -1 - Daniel Fischer
没有将一个值“转换”为二进制的说法——在计算机中,所有内容都是以二进制形式存储的——其他的只是为了我们的方便。有关二进制补码具有与正数相同的位值的说法对于x86处理器来说是不正确的,它们被取反并加上1。否则,如何使所有位设置等于-1呢? - jinzai

7

只有当类型为无符号时才会出现。有符号整数使用最高位作为否定标志,因此将其设置为1会导致负数。请参见二进制补码


6

在无符号整数中,所有1的位模式为4294967295;对于一个带有超过32 位的有符号整数也是如此。对于一个以二进制补码表示的32 位有符号整数来说,它的值为-1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接