[c] ~ x + ~ y == ~ (x + y)는 항상 거짓입니까?

이 코드는 항상 거짓으로 평가됩니까? 두 변수 모두 2의 보수 부호있는 정수입니다.

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

조건을 만족하는 숫자가 있어야한다고 생각합니다. 나는 사이의 숫자를 테스트하려 -5000하고 5000있지만, 결코 이루어지지 평등. 조건에 대한 해를 찾기 위해 방정식을 설정하는 방법이 있습니까?

하나를 다른 것으로 바꾸면 프로그램에 교활한 버그가 발생합니까?



답변

모순을 위해 다음 x과 같은 일부 y(mod 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(mod 2 n )에 대해.


* 1의 보수 산술을 가진 기계에서, 평등은 실제로 모두 x와에 대해 사실을 유지한다는 것이 흥미 롭습니다 y. 이것은 하나의 보완 아래에 있기 때문 ~x = -x입니다. 따라서 ~x + ~y == -x + -y == -(x+y) == ~(x+y).


답변

2의 보완

광대 한 경우 컴퓨터의 대부분, x정수, 다음 -x과 같이 표현된다 ~x + 1. 마찬가지로 ~x == -(x + 1). 방정식 에서이 substution을 만들면 다음과 같이됩니다.

  • ~ x + ~ y == ~ (x + y)
  • -(x + 1) +-(y + 1) =-((x + y) + 1)
  • -x-y-2 = -x-y-1
  • -2 = -1

모순이므로 ~x + ~y == ~(x + y)항상 false 입니다.


즉, pedants는 C가 2의 보수를 요구하지 않는다는 것을 지적 할 것이므로 우리도 고려해야합니다 …

보완

에서 1의 보수 , -x간단하게 표현된다 ~x. 0은 모두 0 +0과 ( -1 -0) 표현 을 모두 갖는 특별한 경우 이지만 IIRC, C는 +0 == -0비트 패턴이 다른 경우에도 필요 하므로 문제가되지 않습니다. 그냥 교체 ~와 함께 -.

  • ~ x + ~ y == ~ (x + y)
  • -x + (-y) =-(x + y)

이는 사실 모두 xy.


답변

단지 오른쪽 모두의 비트 고려 x하고 y(IE를합니다. x == 131101기본 2, 우리는, 마지막 비트에 보일 것이다 1다음 네 가지 경우가 있습니다)

x = 0, y = 0 :

LHS : ~ 0 + ~ 0 => 1 + 1 => 10
RHS : ~ (0 + 0) => ~ 0 => 1

x = 0, y = 1 :

LHS : ~ 0 + ~ 1 => 1 + 0 => 1
RHS : ~ (0 + 1) => ~ 1 => 0

x = 1, y = 0 :

숙제이기 때문에 나는 이것을 당신에게 맡길 것입니다 (힌트 : x와 y가 바뀌었을 때의 것과 동일합니다).

x = 1, y = 1 :

이것도 당신에게 맡기겠습니다.

가능한 한 입력이 주어지면 방정식의 왼쪽과 오른쪽에서 가장 오른쪽 비트가 항상 다름을 보여줄 수 있습니다. 따라서 양쪽 비트가 뒤집힌 비트가 적어도 있기 때문에 양쪽이 같지 않다는 것을 증명했습니다 서로로부터.


답변

비트 수가 n 인 경우

~x = (2^n - 1) - x
~y = (2^n - 1) - y


~x + ~y = (2^n - 1) +(2^n - 1) - x - y =>  (2^n + (2^n - 1) - x - y ) - 1 => modulo: (2^n - 1) - x - y - 1.

지금,

 ~(x + y) = (2^n - 1) - (x + y) = (2^n - 1) - x - y.

따라서 그들은 항상 1의 차이로 불평등합니다.


답변

힌트:

x + ~x = -1(모드 2n )

질문의 목표가 (C-read-the-C- 사양 기술이 아닌) 수학을 테스트한다고 가정하면 대답을 얻을 수 있습니다.


답변

1과 2, 그리고 심지어 42의 보수에서, 이것은 증명 될 수 있습니다 :

~x + ~y == ~(x + a) + ~(y - a)

이제 a = y우리는 :

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

또는:

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

따라서 2의 보수에서 ~0 = -1 에서 제안은 거짓입니다.

그 보완책 ~0 = 0에서 제안은 사실입니다.


답변

Dennis Ritchie의 저서에 따르면 C는 기본적으로 2의 보수를 구현하지 않습니다. 따라서 귀하의 질문이 항상 사실이 아닐 수도 있습니다.