2의 보수 음수표현 질문
안녕하세요, 2진수의 2의보수를 사용한 음수표현에 대해 궁금한게 생겨서 질문을 남깁니다.
다름이 아니라, 2진수의 음수표현에 대한 예제를 찾다보니 8비트, 4비트를 가지고 예를 드는 것을 많이 봤습니다.
만약 3비트 가지고 예를 든다고 하면 아래와 같이 나옵니다.
10진수 : 0 -> 2진수의 2의보수 : 0 0 0
10진수 : 1 -> 2진수의 2의보수 : 0 0 1
10진수 : 2 -> 2진수의 2의보수 : 0 1 0
10진수 : 3 -> 2진수의 2의보수 : 0 1 1
10진수 : -4 -> 2진수의 2의보수 : 1 0 0
10진수 : -3 -> 2진수의 2의보수 : 1 0 1
10진수 : -2 -> 2진수의 2의보수 : 1 1 0
10진수 : -1 -> 2진수의 2의보수 : 1 1 1
제가 궁금한 것은 이를 계산하는 과정입니다.
3비트를 가지고 -3을 2진수의 2의 보수로 표현할 때 다음과 같이 계산했습니다.
1. 10진수 -3을 2진수로 변환합니다.
1.1 10진수 3을 3비트에 맞춰서.. 011로 변경
1.2 음수이므로 최상위비트 1로 바꿔서 111
2. 111을 1의 보수로
2.1 1은 0으로, 0은 1로
2.2 111 -> 100 다만, 부호비트는 변경하지 않습니다.
3. 100을 2의 보수로
3.1 1의 보수인 100을 2의 보수로 만들려면 1을 더합니다.
3.2 100 + 001 = 101
따라서 10진수 -3의 2진수 음수표현(2의 보수)은 101이 됩니다.
** 그런데 진짜 문제는 -4를 표현할 때에 있습니다.
1. -4를 2진수로.. => 1100
-3까지는 3비트를 벗어나지 않았습니다만, -4부터는 부호비트를 포함해서 총 4비트를 가지고 계산해야합니다.
2. 1100 -> 1's : 1011 (부호비트는 유지)
3. 1011 -> 2's : 1100 (-4)
4. 그러나 내가 원하는 것은 3비트까지의 표현이므로 앞에 최상위 비트를 날리면 3비트로 -4를 표현하면 100이 됩니다.
이게.. 계산은 4비트로 하면서, 표현을 3비트로 하다보니 결국 앞에 1비트를 날리게 되는데..
어떻게 답은 나오는데, 스스로가 찝찝해서 여쭙습니다.(질문을 적다보니 뭔가..잘못알고 있는 것 같기도 한데..무엇을 잘못알고있는지 감이 안 잡힙니다.)
** 10진수 -4를 3비트로 표현하려면 어떻게 계산하는 것이 옳은지 궁금합니다.
//////////////////////////////
찾다보니.. https://kldp.org/node/111192
위 글에서 언급된
"모든 이진수 연산에서 뺄셈은 2의 보수를 이용해 덧셈으로 바꿀 수 있다. 물론 그 경우 캐리가 발생한다. 그래서 유효 자리수만 인정하고 캐리는 무시한다."라는 말이 있는데, 이게 제가 유효한 3비트까지만 인정하고 그 앞의 1비트를 날린 거와 같은 말인가요?
1. 10진수 -3을 2진수로 변환합니다.
첫번째 잘못 때문에 4를 바꾸기 위해 100에 부호비트를 붙이자니 1100이 되는 이상한 상태가 나옵니다.
좋은 하루 되세요!
아하..
부호를 중요시 생각해서 계산하는 것이 오히려 독이 되어서..
덕분에 잘못된 점을 알게되어서 감사합니다!
2의 보수일경우 어떤 수와 그 수의 2의 보수의 합은
2의 보수일경우 어떤 수와 그 수의 2의 보수의 합은 무조건 2^n 입니다.
n은 자릿수라 그때그때 달라요. 3비트일경우 원 수와 2의 보수의 합은 2^3=8 입니다.
3비트 환경에서 -3을 2의 보수로 표현하면 2^3-3=8-3=5, 2진수로 101 입니다.
4비트일경우 2^4-3=16-3=13, 2진수로 1101이고요.
실제 사용은 윗분이 말씀하신대로 2진수로 표현한 원수의 0과 1을 뒤집은다음 1 더해주면 됩니다.
그리고 마지막 질문 답변 드린다면 3비트 환경에서 (-3)-3을 계산해 보시면 됩니다. 2진수로 계산하면 101+101 이므로 계산하면 1010이 되는데 3비트 환경이므로 최상위 1 버리고 010만 취하게 됩니다. 버려진 최상위 1은 carry로 들어가고요. 즉, 2의 보수로 계산하면 넘쳐나는 자리만 잘린 정확한 계산값이 들어갑니다.
초창기 컴퓨터는 최상위 비트로 음수표시하거나 1의 보수를 썼는데 이것들은 이런 오버플로 나는 케이스를 대비한 보정회로가 필요한데 2의 보수는 이게 필요없습니다. 표현 불가능한 자리만 잘린 정확한 결과가 나오니까요. 이때문에 지금 쓰는 컴퓨터들은 음수 표현이 거의 2의 보수입니다.
Written By the Black Knight of Destruction
오...그렇군요..
친절한 답변 너무 감사드립니다.
2의 보수는 잘려도 그 비트까지는 정확한 값이라.. 놓치고 있는 부분이었습니다!
아 그리고 질문 하나만 더 드려도 될까요??
** 부호화크기 / 1의 보수 / 2의 보수는 모두 양수를 표현할 때는 2진수 값이 동일합니다.
(이거 마치 1+1=2가 맞는지를 물어보는 것 같아서..좀 부끄럽네요 허허..)
2진수의 양수 값이 동일한 이유는 음수와 달리 양수를 표현함에 있어서 별 다른 점이 없어서인가요?
2의 보수로 음수 표현하면 계산결과가 해당
2의 보수로 음수 표현하면 계산결과가 해당 자릿수만큼의 정확한 결과가 나오기 때문에 별다른 보정 같은게 필요 없습니다. (넘쳐나는 자릿수만 버린 그 결과)
예를 들어 어떤 8비트 변수에 127+1을 계산해서 나온 값을 넣었는데, 사용하는 사람이 unsigned로 간주하면 예상한대로 128이지만 signed라면 원 수와 다른 -128입니다. 하지만 2진수로 따지고 보면 둘 다 똑같은 10000000이고, unsigned일 경우 8비트 다 쓰는거고, signed일 경우 최상위 비트 하나를 양수(0) 혹은 2의 보수로 표현된 음수(1)로 간주하고 나머지 7bit만이 실제 수니 최상위 비트가 짤려나가고 나머지 7bit 0000000을 2의 보수로 바꾸어서 나온 음수가 되는거고. 컴퓨터의 표현은 똑같지만 사람이 그것을 무엇으로 간주하느냐에 따라 달라지는거죠.
Written By the Black Knight of Destruction
감사합니다^^
감사합니다. 덕분에 2의 보수에 대해서 많은 정리를 할 수 있었습니다!
댓글 달기