2012-06-10 41 views
5

así como me fue reading about ~,¿Por qué ~ 0 es -1?

Realiza el operador NOT en cada bit.

Así que he intentado:

0 = 00000000000000000000000000000000 

     so ~0 should be 

~0 = 11111111111111111111111111111111 

Pero cuando lo probé, devuelve -1. ¿No es 11111111111111111111111111111111 es 4294967295 en decimal?

+1

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

+0

@copy - Está en 'C' no en JavaScript. –

+4

Es algo muy básico que se aplica a la mayoría de los lenguajes de programación. Lee http://en.wikipedia.org/wiki/Two%27s_complement o http://stackoverflow.com/a/3141181/1078067 – copy

Respuesta

9

Se interpreta como un entero con signo, y en complemento a dos, un entero con todos los bits 1 es -1.

+0

Así que cuando conviertas '4294967295' en binario y luego lo vuelves a convertir en decimal, se convertirá en' -1'? –

+1

Posiblemente valga la pena agregar - en complemento a dos, todos los bits tienen el mismo valor que para un valor sin signo, excepto para el más significativo. Ese bit más significativo (MSB) tiene su valor negado en relación con el mismo bit en un valor sin signo, p. para enteros de 32 bits, el MSB vale -2147483648 para el complemento a dos en lugar de +2147483648 para sin firmar. – Steve314

+1

Eso depende del lenguaje y tipos utilizados, @Derek. Si recuerdo el comportamiento de Javascript correctamente, si ingresas '4294967295', se tratará como un' número' y se representará internamente como 'doble', por lo que no se convertirá en' -1' automáticamente. Pero si realiza operaciones de bits en él, se convertirá en un entero (firmado) de 32 bits, y luego el patrón de bits se interpretará como '-1'. –

6

Un patrón de bits de todos los 1 s es 4294967295 para un entero sin signo, o un entero con signo con más de 32-bits. Para un entero con signo con 32 bits representado como dos complemento es -1.

7

Solo si el tipo no está firmado. Los enteros con signo utilizan el bit superior como indicador de negación, y al establecerlo en 1 se obtiene un número negativo. Ver Two's Complement.