이 코드는 항상 거짓으로 평가됩니까? 두 변수 모두 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
모든 x
및 y
(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)
이는 사실 모두 x
와 y
.
답변
단지 오른쪽 모두의 비트 고려 x
하고 y
(IE를합니다. x == 13
인 1101
기본 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의 보수를 구현하지 않습니다. 따라서 귀하의 질문이 항상 사실이 아닐 수도 있습니다.