~x + ~y == ~(x + y)는 항상 거짓입니까?
이 코드는 항상 false로 평가됩니까?두 변수 모두 2의 보완 부호 ints입니다.
~x + ~y == ~(x + y)
조건에 맞는 숫자가 있어야 할 것 같아요.나는 그 사이의 숫자를 시험해 보았다.-5000
그리고.5000
평등을 이루지 못했습니다.그 상태에 대한 해답을 찾기 위해 방정식을 설정하는 방법이 있나요?
한쪽을 다른 쪽과 교환하면 프로그램에 악의적인 버그가 발생합니까?
모순을 위해 어떤 것이 존재한다고 가정하자.x
및 일부y
(modn 2) 다음과 같이 한다.
~(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
(modn 2)
* 흥미로운 점은, 자신의 보완 산술이 있는 기계에서는 실제로 모든 사람에게 동등성이 적용된다는 것입니다.x
그리고.y
왜냐하면 한 사람의 보완 아래,~x = -x
.따라서,~x + ~y == -x + -y == -(x+y) == ~(x+y)
.
2의 보완
대부분의 컴퓨터에서는x
그럼 정수입니다.-x
로 표현된다.~x + 1
마찬가지로~x == -(x + 1)
이 물질을 공식으로 만들면 다음과 같은 결과가 나옵니다.
- ~x + ~y == ~(x + y)
- -(x+1) + -(y+1) = -(x+y) + 1)
- -x - y - 2 = -x - y - 1
- -2 = -1
그건 모순이야, 그래서~x + ~y == ~(x + y)
항상 거짓입니다.
단, Pedants는 C가 2의 보수가 필요없다고 지적할 것이기 때문에, 우리는 또한 검토하지 않으면 안 된다.
보충 자료
보충의 의미로-x
로 간단히 표현된다~x
. 0은 특별한 경우로, 둘 다 0입니다.+0
및 all-1(-0
)의 표현, 단 IIRC, C에는+0 == -0
비트 패턴이 다르더라도 문제 없습니다.대체품~
와 함께-
.
- ~x + ~y == ~(x + y)
- -x + (-y) = -(x + y)
누구에게나 해당된다x
그리고.y
.
둘 다 오른쪽 끝 부분만 고려합니다.x
그리고.y
(IE.의 경우x == 13
어느 것이1101
Base 2에서는 마지막 부분인 a만 살펴보겠습니다.1
다음으로 4가지 경우를 생각할 수 있습니다.
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:
이것도 당신에게 맡기겠습니다.
가능한 입력이 있을 경우 방정식의 왼쪽과 오른쪽에서 맨 오른쪽 비트가 항상 다르다는 것을 보여줄 수 있습니다.따라서 양쪽에는 적어도 서로 반전된 비트가 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
(mod 2n)
질문의 목적이 (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의 보어를 구현하지 않는다.따라서 당신의 질문이 항상 맞는 것은 아닐 수 있습니다.
내버려 두는MAX_INT
로 011111...111
( 의 ( ( ( ( ( 。?~x + x = MAX_INT
★★★★★★★★★★★★★★★★★」~y + y = MAX_INT
때문에 이 두 가지 알 수 거예요.~x + ~y
★★★★★★★★★★★★★★★★★」~(x + y)
1
.
C는 2의 보완이 구현된 것이어야 한다고 요구하지 않는다.단, 부호 없는 정수의 경우 유사한 로직이 적용됩니다.이 논리에서 차이는 항상 1이 됩니다!
물론 C는 2의 보표현을 필요로 하지 않기 때문에 이 동작을 필요로 하지 않습니다.를 들어, 「」라고 하는 것은,~x = (2^n - 1) - x
&~y = (2^n - 1) - y
이 결과를 얻을 수 있습니다.
아, 기초 이산 수학!
~x & ~y == ~(x | y)
~x | ~y == ~(x & y)
부울 증명에 매우 중요합니다!
언급URL : https://stackoverflow.com/questions/11111956/x-y-x-y-is-always-false
'programing' 카테고리의 다른 글
Python 문자열의 u'\uff' (0) | 2022.10.02 |
---|---|
여러 COLUMN_JSON 결과를 JSON 어레이로 반환 (0) | 2022.10.02 |
쿠키와 세션은 무엇이며 서로 어떤 관계가 있습니까? (0) | 2022.10.02 |
PHP에서 세션 시간 초과를 변경하는 방법 (0) | 2022.10.02 |
스프링 스코프 프록시빈 (0) | 2022.10.02 |