본문 바로가기
programming/임시

왜 2의 보수를 하면 부호를 바꾼 값이 되나요?

by hotdogya 2011. 3. 18.

Question)

1) a라는 값의 양수에서 2의 보수(1의 보수+1)를 취하면 -a가 되죠.

그런데 -a에서 2의 보수(1의 보수+1)를 취하면 역시 a가 되나요?

많은 값을 실험해봐도 그렇게 되던데, 왜 그렇게 되는지 논리적으로 적어보려니

잘 안되네요. 1의 보수+1을 했으니, 다시 원래의 값으로 돌리려면 -1을 한 후 1의 보수를

취해줘야 할 것 같은데, 다시 1의 보수+1를 해도 원래의 값으로 돌아가네요. 직관적으로는 알겠는데, 왜 그런 것인지 직관적인 설명이 아니라 명확한 논리로 풀어나가지 못하겠습니다.

Answer)

안녕하세요.

2의 보수를 취하면 양수에서 음수로.. 음수에서 양수로 바뀌죠.

1의보수 + 1이라고 하셨는데요. 이 부분에서 헷갈리신 것이세요.

2의 보수의 개념을 살펴보자면요.

a의 2의 보수인 경우 2^n 형태로 표현되는 Mn이 있습니다. a의 2의 보수를 a'이라고 하면요. 다음과 같은 식이 성립합니다.

a' = M-a

a'을 다시 2의 보수를 취하면요.

a'' = M-a' = M - M + a = a 이 되겠죠. 결국 a가 되는 것입니다.

자 1의 보수는 어떻게 표현이 될까요?

a에 대한 1의 보수는요.

a' = ( (M-1) xor a ) 입니다. M-1은 모두 1로만 이루어진 비트이므로 수식적으로 다음과 동치입니다.

a* = ( M-1 - a)

이것은 십진수에서 생각할때 9999 - 어떤 네자리숫자 를 해도 전혀 빌려오기(carry in)이 발생하지 않는다는 것입니다. 이것과 같은 이치예요..

자 그다음 2의 보수의 정의를 하셨으니..

a' = (a* + 1) = (M -1 - a + 1) = (M - a) 가 됩니다.

1의 보수를 한후 1을 더했으니.. 다음에 되돌릴때에는 1을 빼주는 것이 맞다고 생각할 수 있지만.. 그렇지 않죠. 만약 1을 빼주고 싶다면 다음과 같이 하셔야 합니다.

1의 보수 + 1 을 하고나서..

그것을 되돌릴때에는

1을 먼저 빼고 그다음 1의 보수 보수 취하기.를 하셔야지 맞습니다. 역을 계산할 때에는 방향이 반대가 된다는 점입니다.

예를 들어서 4비트 연산이라고 할때..

0101 을 예를 들자면요.

1의 보수 1010

+1 1011

다시.. 반대로 할려면..

-1 1010

1의 보수 0101

자 원래수가 나왔죠?

1을 빼는 것은 순서를 바꾸면 맞아요. 그러나 1의 보수를 먼저 취한다면 1을 오히려 더해주어야한다는 사실입니다. 왜냐하면 1의 보수는 (M-1) - a 와 같으니까요.

출처

http://kin.naver.com/detail/detail.php?d1id=1&dir_id=10104&eid=SAmxrueAkDP7pcKf8qrnqO0KHS2HxQ56&qb=MsDHuri89g