1. ホーム
  2. c

[解決済み] ~x + ~y == ~(x + y)は常に偽?

2022-04-27 17:51:08

質問

このコードは常にfalseと評価されるのでしょうか?どちらの変数も2の補数符号付きint型です。

~x + ~y == ~(x + y)

条件を満たす数字があってもいいような気がするのですが。の間の数字をテストしてみました。 -50005000 が、一度も等しくなったことがない。条件の解を求める方程式を設定する方法はないでしょうか?

一方を他方に入れ替えると、プログラムに陰湿なバグが発生するのでしょうか?

解決方法は?

矛盾を避けるために、ある種の x と、いくつかの y (修正2 n ) のようなものです。

~(x+y) == ~x + ~y

2の補数*によって、それがわかる。

      -x == ~x + 1
<==>  -1 == ~x + x

この結果に注目すると、次のようになる。

      ~(x+y) == ~x + ~y
<==>  ~(x+y) + (x+y) == ~x + ~y + (x+y)
<==>  ~(x+y) + (x+y) == (~x + x) + (~y + y)
<==>  ~(x+y) + (x+y) == -1 + -1
<==>  ~(x+y) + (x+y) == -2
<==>  -1 == -2

したがって、矛盾が生じる。したがって ~(x+y) != ~x + ~y すべての xy (修正2 n ).


*1の補数演算を行うマシンでは、この等式は実際にはすべての xy . これは、1つの補語の下に ~x = -x . このように ~x + ~y == -x + -y == -(x+y) == ~(x+y) .