본문 바로가기

Software/C/C++

[C++] 이진수의 보수계산법

보수계산법이 왜 존재해야 하는가?
    컴퓨터의 뺄셈 계산을 존재한다. 모던 수의 뺄셈은 덧셈화 하여 처리한다.
    예를들어 5 - 4 는 5+(-4)로 변환하여 계산 할수 있다.
보수는 무엇인가?
    보수는 양수를 음수화로 표현하기 위한 방법이다. 즉, 보충하는 수. 양수에 대한 보수가   
    음수입니다.
어떻게 보수를 만드는가?
    보수에서 1의 보수를 먼저 설명합니다.
     1의 보수는 양의 수에서 0->1로, 1->0으로 바꿔주면 됩니다.
     즉,4(D:10진수) == 0100(B:2진수) ---보수---> 1011(B)가 된다.
●덧셈,뺄셈으로 예를 들면.
   7+5와 7-5, 그리고, 5-7로 나누어 생각해볼수있다.(5+7은 7+5와같으므로 생략)
   
   1)7+5 = 12   이를 이진으로 표현하면,
    0111
+) 0101
    1100 => 12    별 문제 없이 계산이 됨.

2) 7-5 = 2 인데 이를 계산하면 컴퓨터에서 뺄셈은 없으므로 덧셈으로 변환을 하면,
    7+(-5) = 2 인데, 5는 여기서 음수가 된다. 이를 이진화하면,
                                                    0111(7)
      0101(5)---보수(음수화)---> +)1010(-5)
                                                   10001  => 이 값에서 최상위 비트 1은 버림.
                                                                   그리고 자리보정을 해야 하므로 +1하면
                                                                    0010 이 됨. 그러므로 2가 나옴.
3) 5-7 = -2 를 계산하면                  0101(5)
                                                  +)1000(-7)
                                                     1101   => 이 값은 맨앞자리가 음수를 의미하고, 101의
                                                      음수 값은 아래 표와 같이 2가된다. 그러므로 -2가 됨.
왜 2의 보수가 필요한가?
   2의 보수가 필요한게 된것은 아래 표를 보면, 1의 보수 표현에서 0이라는 값이 두가지로
   나타날수있다. 이는 심각한 오류를 야기 할수있기 때문에 다시 수정이 필요하고,
   그 방법으로 +(-1)을 해준다. -1을 1111로 정의 했기 때문에 음수의 증가는 1111 +(-1)
   하면, -2가 된다.이는 1111 + (1110 : -1)로 계산 식이 나며, 이는 & 연산이 된다.
    2의 보수는 0의 표현에 오류를 보완하며, 자리수의 표현도 한자리 더 표현이 가능하다
    는  장점이 있다.   
2의 보수 계산법으로 5-7을 하면?
    0101(5)                                0101(5)                                      0101(5)
 -)0111(7)---보수 표현--->   +)1000(-7)--2의보수 표현 +1--> +)1001(-7) : 아래 표참조
                                              --------                                    --------
                                               식① +1   --같은 결과--->             식②
 -->식① 과  식②의 계산은 같아야 한다. 식①을 계산하면 1101이 나오고 여기서 2의 보수표현을 하지 않았으므로 +(1)을 하면 1110 나옴.
-->식②를 계산하면 1110 이 나오고, 식①과 같으며, 아래 표에서 보듯이 1110은 -2가 된다.


                                               
                                                         

Binary

1의보수

2의보수

0011

3

3

0010

2

2

0001

1

1

0000

0

0

1111

-0

-1

1110

-1

-2

1101

-2

-3

1100

-3

-4

1011

-4

-5

1010

-5

-6

1001

-6

-7

1000

-7

-8