2의 보수 음수표현 질문

wtwon의 이미지

안녕하세요, 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비트를 날린 거와 같은 말인가요?

raymundo의 이미지

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 다만, 부호비트는 변경하지 않습니다.
<-- 위에서 잘못을 하니까, 1의 보수로 바꾼다면서 어떤 비트는 반전하고 어떤 비트는 그냥 놔두는 비일관성이 생김
 
3. 100을 2의 보수로
3.1 1의 보수인 100을 2의 보수로 만들려면 1을 더합니다.
3.2 100 + 001 = 101

첫번째 잘못 때문에 4를 바꾸기 위해 100에 부호비트를 붙이자니 1100이 되는 이상한 상태가 나옵니다.

-3을 3비트로 표현:
1. 3을 이진수로 표현 011
2. 1의 보수로 변환 100
3. +1 => 101. 끝
 
-4를 3비트로 표현:
1. 4를 이진수로 표현 100
2. 1의 보수로 변환 011
3. +1 => 100. 끝

좋은 하루 되세요!

wtwon의 이미지

부호를 중요시 생각해서 계산하는 것이 오히려 독이 되어서..
덕분에 잘못된 점을 알게되어서 감사합니다!

Necromancer의 이미지

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

wtwon의 이미지

친절한 답변 너무 감사드립니다.
2의 보수는 잘려도 그 비트까지는 정확한 값이라.. 놓치고 있는 부분이었습니다!

아 그리고 질문 하나만 더 드려도 될까요??

** 부호화크기 / 1의 보수 / 2의 보수는 모두 양수를 표현할 때는 2진수 값이 동일합니다.
(이거 마치 1+1=2가 맞는지를 물어보는 것 같아서..좀 부끄럽네요 허허..)
2진수의 양수 값이 동일한 이유는 음수와 달리 양수를 표현함에 있어서 별 다른 점이 없어서인가요?

Necromancer의 이미지

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

wtwon의 이미지

감사합니다. 덕분에 2의 보수에 대해서 많은 정리를 할 수 있었습니다!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.