2012-06-10 130 views
5

因此,我是reading about ~为什么〜0是-1?

对每一位执行NOT运算符。

所以,我想:

0 = 00000000000000000000000000000000 

     so ~0 should be 

~0 = 11111111111111111111111111111111 

但是,当我尝试,它返回-1。是不是11111111111111111111111111111111是十进制的4294967295

+1

Duplicate:http://stackoverflow.com/questions/3141163/why-do-unsigned-int-x-1-and-int-y-0-have-the-same-binary-representation – copy

+0

@copy - 它在'C'不是JavaScript。 –

+4

这是一个非常基本的东西,适用于大多数编程语言。阅读http://en.wikipedia.org/wiki/Two%27s_complement或http://stackoverflow.com/a/3141181/1078067 – copy

回答

9

它被解释为一个有符号的整数,并且在二进制补码中,所有位1的整数是-1

+0

所以,当你把'4294967295'变成二进制,然后把它变回十进制,它将变成' -1'? –

+1

可能值得加 - 二进制补码中,除最重要外,所有位都具有与无符号值相同的值。最高有效位(MSB)的值相对于无符号值中的同一位而言是否定的 - 例如,对于32位整数,MSB的值为-2147483648,而不是+2147483648的无符号值。 – Steve314

+1

这取决于使用的语言和类型,@Derek。如果我记得Javascript的行为是正确的,那么如果你输入'4294967295',它将被视为'number'并且在内部被表示为'double',所以它不会被自动转换为'-1'。但是如果你对它进行位操作,它将被转换成(带符号)32位整数,然后位模式被解释为'-1'。 –

6

所有1 s的位模式是用于4294967295无符号整数,或具有多于32位一个符号整数。对于带有的32位有符号整数表示为二进制补码-1

7

只有类型是无符号的。带符号的整数使用最高位作为否定标志 - 因此将其设置为1会导致负数。见Two's Complement