¿Este código siempre se evalúa como falso? Ambas variables son complementos firmados por dos.
~x + ~y == ~(x + y)
Siento que debería haber algún número que satisfaga las condiciones. Traté de probar los números entre -5000
y 5000
nunca logré la igualdad. ¿Hay alguna manera de establecer una ecuación para encontrar las soluciones a la condición?
¿Cambiar uno por el otro causará un error insidioso en mi programa?
true
incluso si nunca pueden asumir un complemento estricto de dos.Respuestas:
Supongamos, en aras de la contradicción, que existe algo
x
y algoy
(mod 2 n ) tal quePor el complemento a dos *, sabemos que,
Observando este resultado, tenemos,
Por lo tanto, una contradicción. Por lo tanto,
~(x+y) != ~x + ~y
para todosx
yy
(mod 2 n ).* Es interesante notar que en una máquina con aritmética complementaria, la igualdad es válida para todos
x
yy
. Esto es debido a que bajo de un complemento,~x = -x
. Por lo tanto,~x + ~y == -x + -y == -(x+y) == ~(x+y)
.fuente
~x == -(x+1)
, así~(x+y) == ~x + ~y
implica-(x+y+1) == -(x+1) + -(y+1)
implica-1 == -2
Complemento de dos
En la gran mayoría de las computadoras, si
x
es un número entero, entonces-x
se representa como~x + 1
. De manera equivalente,~x == -(x + 1)
. Hacer esta sustitución en su ecuación da:lo cual es una contradicción, por
~x + ~y == ~(x + y)
lo que siempre es falso .Dicho esto, los pedantes señalarán que C no requiere el complemento de dos, por lo que también debemos considerar ...
Complemento de uno
En el complemento de uno ,
-x
simplemente se representa como~x
. Cero es un caso especial, que tiene representaciones de todo-0 (+0
) y todo-1 (-0
), pero IIRC, C requiere+0 == -0
incluso si tienen patrones de bits diferentes, por lo que esto no debería ser un problema. Solo sustitúyalo~
por-
.lo cual es cierto para todos
x
yy
.fuente
+0 == -0
. Finalmente algo que tiene sentido en C. :)Considere solo el bit más a la derecha de ambos
x
yy
(IE. Six == 13
está1101
en la base 2, solo veremos el último bit, a1
) Luego hay cuatro casos posibles:x = 0, y = 0:
x = 0, y = 1:
x = 1, y = 0:
x = 1, y = 1:
Puede mostrar que el bit más a la derecha siempre será diferente en el lado izquierdo y en el lado derecho de la ecuación dada cualquier entrada posible, por lo que ha demostrado que ambos lados no son iguales, ya que tienen al menos ese bit invertido de cada uno.
fuente
Si el número de bits es n
Ahora,
Por lo tanto, siempre serán desiguales, con una diferencia de 1.
fuente
~
operación en números de ancho no fijo?Insinuación:
x + ~x = -1
(mod 2 n )Asumiendo que el objetivo de la pregunta es probar sus matemáticas (en lugar de sus habilidades de leer las especificaciones C), esto debería llevarlo a la respuesta.
fuente
En el complemento de uno y dos (e incluso en 42), esto se puede probar:
Ahora deja
a = y
y tenemos:o:
Por lo tanto, en el complemento a dos
~0 = -1
, la proposición es falsa.En complemento a eso
~0 = 0
, la proposición es verdadera.fuente
Según el libro de Dennis Ritchie, C no implementa el complemento de dos por defecto. Por lo tanto, su pregunta puede no ser siempre cierta.
fuente
Dejar
MAX_INT
ser el int representado por011111...111
(por muchos bits que haya). Entonces lo sabrás~x + x = MAX_INT
y~y + y = MAX_INT
, por lo tanto, sabrás con certeza que la diferencia entre~x + ~y
y~(x + y)
es1
.fuente
C no requiere que el complemento a dos sea lo que se implementa. Sin embargo, para enteros sin signo se aplican lógicas similares. ¡Las diferencias siempre serán 1 bajo esta lógica!
fuente
Por supuesto, C no requiere este comportamiento porque no requiere la representación del complemento de dos. Por ejemplo,
~x = (2^n - 1) - x
&~y = (2^n - 1) - y
obtendrá este resultado.fuente
¡Ah, matemática discreta fundamental!
Echa un vistazo a la ley de De Morgan
¡Muy importante para las pruebas booleanas!
fuente