'프로그래밍'에 해당되는 글 35건

  1. 2008.04.25 2의 보수 표현법
프로그래밍2008. 4. 25. 00:13
반응형
2의 보수에 대하여 알아보기 전에 1의 보수에 대하여 먼저 알아보도록 하겠습니다. 1의 보수는 0은 1로 1은 0으로 바꾸는 방식입니다.

1의 보수
0000 0100 -> 1111 1011
이렇게 바꾸는 것이 1의 보수입니다.

2의 보수는 1의 보수에 1을 더하는 것입니다.
0000 0100 -> 1111 1011 +1 -> 1111 1100
위에 예제에서 2의 보수는 음수값을 가지고 있습니다.

그럼 이렇게 사용하는 이유에 대하여 알아보도록 하겠습니다. 컴퓨터에서 음수를 표현하기 위해 처음 생각한 것은 1의 보수에 의한 표현입니다.
예를 들어
  4: 0000 0100
-4: 1111 1011
이런식으로 표현을 하였습니다. 여기에서 참고로 이때 실제로 사용하는 것은 7비트만을 사용합니다. 그 이유는 전부인 8비트를 사용하면 음수값과 구별이 안 되기 때문입니다. 이때 숫자 값으로 사용되지 않는 맨 앞비트를 부호로 표현하였습니다. 이를 사인비트라고 합니다.

그런데 1의 보수를 사용하다 보면 문제가 있습니다. 그 문제는 0이 2개가 생긴다는 것입니다.

+0 : 0000 0000
-0 : 1111 1111

0은 매우 중요한 숫자이므로 이러한 문제가 발생이 되면 안됩니다. 그래서 2의 보수를 만들게 되었습니다.

2의 보수는 1의 보수의 +1 입니다.

그래서 1111 1111은 0이 아니고 -1 입니다.

0000 0001 -> 1111 1110 -> 1111 1111

그러므로 한 바이트의 범위는 -128 ~ 127 이 됩니다.

물론 2의 보수를 사용한다면 연산이 쉽게 됩니다.

우리가 보통 사용하는 컴퓨터들은 뺄셈 로직이 없습니다. 뺄셈 로직이 있다면 보수를 사용할 이유가 없어집니다. 4-4를 그냥 연산하면 된다는 의미이겠지요. 하지만 뺄셈 로직이 없기 때문에 4-4를4 + (-4)로 계산하게 됩니다. 4를 빼는 것이 아니라 -4로 바꿔서 더하는 것입니다.
그럼 컴퓨터가 왜 2진수로 변환된 데이터만을  취급하는 이유에 대해 알아보겠습니다. 하드웨어적인 이유에서도 2의 보수를 사용하는 이유가 있습니다. 컴퓨터의 내부는 전자부품인 IC(Integrated Circuit = 직접회로)로 구성되어져 있습니다. 간단히 말하자면 컴퓨터 내부를 뜯어 보았을때, cpu의 양쪽에 여러개에서 수백개까지의 다리처럼 붙어있는 지네같은 모양을 IC라고 부릅니다. 이 IC에 달려있는 지네의 다리모양의 핀들은 보통 직류전압 0V 나 5V중 하나의 전압을 갖게 됩니다. 따라서 IC의 핀 1개로는 두 가지 상태밖에 나타낼 수 없습니다.
이러한 하드웨어의 여건상 컴퓨터는 부득이하게 2진수를 사용하게 되었습니다. 물론, 더 좋은 IC를 개발할 수 있지만, 평이하고 대중화 시키기에는 2개의 전압을 갖는 IC를 제작하는 것이 컴퓨터 가격면이나 성능면에서 결코 떨어지지 않기 때문에 사용하는 것입니다.

그럼 2의 보수가 컴퓨터 시스템 상에서 얼마나 중요한 것인지 알아보았습니다. 그럼 5 개의 숫자에 대한 2의 보수를 예제로 들어보도록 하겠습니다.

EX1)
       ‘1’ 의 2의 보수

0000 0001   →   1111 1110   →   1111 1111
    < 1 >            <1의 보수>        <2의 보수>
EX2)
       ‘3’ 의 2의 보수

0000 0011   →   1111 1100   →   1111 1101
    < 3 >            <1의 보수>        <2의 보수>      
EX3)
       ‘6’의 2의 보수

0000 0110   →   1111 1001   →   1111 1010
    < 6 >            <1의 보수>        <2의 보수>
EX4)
       ‘9’의 2의 보수

0000 1001   →   1111 0110   →   1111 0111
    < 9 >            <1의 보수>        <2의 보수>
EX5)
       ‘10’ 의 2의 보수

0000 1010   →   1111 0101   →   1111 0110
   < 10 >           <1의 보수>        <2의 보수>



그럼 뺄셈의 예제를 들어보도록 하겠습니다.

EX1)
       “9 - 9”
       9 - 9    →   9 + (-9)
     9: 0000 1001
   -9: 1111 0111
결과:  0000 0000      결과값은 ‘0’ 나오게 됩니다.

EX2)
       “7 - 4”
        7 - 4    →   7 + (-4)
      7: 0000 0111
    -4: 0000 0100(4) → 1111 1011 (4의 1의보수) → 1111 1100(4의 2의보수)
   결과 : 0000 0011   결과값은 ‘3’ 나오게 됩니다.

EX3)
      “19 -10”
      19 - 10   →   19 + (-10)
    19: 0001 0011
  -10: 0000 1010(10) → 1111 0101(10의 1의보수) → 1111 0110(10의 2의보수)
결과 : 0000 1001  결과값은 ‘9’ 나오게 됩니다.

EX4)
       “3 - 5”
      3 - 5   →   3 + (-5)
      3: 0000 0011
    -5: 0000 0101(5) → 1111 1010(5의 1의보수) → 1111 1011(5의 2의보수)
  결과: 1111 1110  결과값은 ‘-2’ 나오게 됩니다.

EX5)  
      “1 - 7”
      1 - 7   →   1 + (-7)
     1: 0000 0001
   -7: 0000 0111(7) → 1111 1000(7의 1의보수) → 1111 1001(7의 2의보수)
결과: 1111 1010  결과값은 ‘-6’ 나오게 됩니다.
반응형
Posted by pmj0403