×
Crocus
공부한 내용을 정리하는 블로그로 시작한
Crocus는 2014년 1월 14일 부터 시작하여
현재 월 6만명, 총 2,101,745명의 방문자 수를 기록하고 있습니다.
Donation
이제 많은 사용자들이 이용하는 만큼
더 다양한 서비스 개발/제공을 위해 후원금을 모금하고자 합니다.
후원을 해주시는 분들은 Donators 명단에 성명, 후원금을 기입해드리며
Crocus 블로그가 아닌 다른 곳에 정리해둔 저만의 내용을 공유해 드리고자 합니다.
Account
예금주 : 고관우
신한은행 : 110-334-866541
카카오뱅크 : 3333-01-7888060

👉 후원 페이지 바로가기 Donators
익명 : 5000원(Crocus응원합니다.)
busyhuman: 5000원(유용한 지식 감사합니다.)
익명 : 5000원(알고리즘 학습러)
반응형

행여나 보수 검색을 통해 들어왔다면 이 게시물이 글로 이루어 졌다고 뒤로가기를 누르지 않길 바랍니다.


보수를 모르는 사람 입장에서 상세히 적어 놓았으므로 한번 읽어보시길 바랍니다.




진법에 대하여 알아 보았으니, 이제 그 진법들을 이용하여 보수를 구하고, 값을 구하는 법을 알아본다.


우선 앞서서 보수는 왜 알아야 되는걸까?


컴퓨터에서 연산 시, 2-1 = 1을 알려주는데 사실 컴퓨터는 -라는 개념이 없다.


따라서 보수라는 것을 생성하여 2 + 보수값 = 1을 만들어버린다.


이것이 보수를 만든 이유이고, 컴퓨터에 대해 조금 더 깊게 가고자 한다면 보수를 알아야 하는 이유이다.



보수는 결국 뺄셈 연산을 위한 용도로 이용된다.


n진수의 보수는 n의 보수와 n - 1의 보수가 있다. 즉, 2진수는 2의 보수, 1의 보수가 있고,


10진수는 10의 보수, 9의 보수가 있다.


[ n진법 n의 보수 구하는 법 ]


n의 보수를 구하는 법은 자릿수가 넘어가지 않는 범위에서의 최댓값 + 1을 의미한다.


즉, 2진수 1001이 있었다면 2의 보수는


자릿수가 넘어가지 않는 범위에서의 최댓값 :: 0110에서 +1인 0111이다.


 따라서 2진수 1001의 2의 보수는 0111이다.


10진수 9298의 10의 보수는 


자릿수가 넘어가지 않는 범위에서의 최댓값 :: 701에서 + 1인 702이다.


이제 이것을 이용하여 무슨 뺄셈 연산을 하는지 알아보자.


10 - 2를 연산한다 가정하자. 


이때 2진수로 변환하면 1010 - 0010이다. 하지만, 컴퓨터는 - 연산이 실재로 없다.


따라서 - 0010을 2의 보수로 변환하면 1101 + 1인 111...111...11110이기에 


10과 더하면 000...000...01000이 된다.


이때 01000의 의미는, 1 1000으로 해석 하면 되는데, 앞의 1은 음수이면 1, 양수이면 0이고


뒤의 이진수는 그 값을 의미한다. 결국 8이라는 것을 의미한다.


그렇다면 2 - 10은 당연히 11000이 나와야 한다. 검토해보자.


0010 - 1010 -> 0010 + (0101 + 1) -> 0010 + 0110 = 1000 즉, 11000이다.


첫번째 자리 값이 0이면 양수, 1이면 음수임을 알고있자.



이제 n진법의 n의 보수를 보았으니, n - 1의 보수에 대해 확인해보자.


[ n진법 n-1의 보수 구하는 법 ]


만약 2진수 값이 10101이면 1의 보수는 10^5 - 1 - 10101이다. 즉, 100000 - 1 - 10101 = 01010이 1의 보수이다.


이때 10^5라 함은 10진수를 의미하는것은 아니고, 2^5라 적어야 맞지만, 32라 착각 할 수 있고, 2^5가


바로 직관적으로 100000라고 떠오르지 않기에 10^5라 적겠다.


결론적으로 1의 보수는 10^(n진수의 자릿수) - 1 - 현재 값이다.


위의 값 그대로 10 - 2를 해보자.


1010 - 0010인데 - 0010을 1의 보수로 바꾸면 10^4 - 1 = 10000 - 1 - 0010= 01111 - 0010 = 1101  


즉, 1010 + 1101 = 10111이다. 2의 보수에서 계산하듯이 하면 7이다. 뭔가 틀린것 같다.


2의 보수에서 계산과 차이점은 1의 보수에서는 첫자리수가 1이 나온다면 1을 더해준다.


즉 10111이니 첫자리가 1이니 +1을 해준다. 즉, 11000이 된다.


따라서 +8임을 확인 할 수 있다.



10진수를 이용해서 풀어본다면, 9298 - 0298을 해보자.


9298 - 0298에서 - 0298을 9의 보수로 바꾸면 10^4 - 1 - 0298= 10000 - 1 - 298 = 9999 - 298 = 9701


따라서 9298 + 9701= 18999 여기서 가장 앞자리수가 1이니 +1을 해주면 19000이 된다.


즉 + 9000이라는 의미이다.



그렇다면 298 - 9298을 해보자.


298 - 9298에서 9298의 9의 보수는 10000 - 1 - 9298 = 701이다.


298 + 701 = 999인데, 이때 오버플로우가 일어나는 현상이 없었다.

(여기서 오버플로우라 함은 위에서 가장 앞자리 수가 1이라는 그런 것을 의미한다. 

즉, 4자리 수에서 계산중인데 5자리수가 됬을때 그때의 첫째 자리수를 의미한다.)


따라서 0999라 해석 할 수 있고, -999의 9의 보수를 다시 구하면 된다.


즉, 10000 - 1 - 999가 되어 -9000이 된다.


n-1의 보수에서는 오버플로우가 일어날 시, 1이면 1을 더하고 +값을 도출하고,


오버 플로우가 없다면 그 수를 다시 보수를 취해서 -값을 넣는다.

반응형
  1. 꼬순내 2018.09.23 21:35 신고

    안녕하세요
    이진수에서 제일 앞에자리는 부호를 나타내는데 0이 양수 1이 음수 아닌가요?
    반대로 적혀있는 거 같아서 댓글 남깁니다.

  2. ? 2019.07.19 08:56

    10 - 2를 연산한다 가정하자.



    이때 2진수로 변환하면 1010 - 0010이다. 하지만, 컴퓨터는 - 연산이 실재로 없다.



    따라서 - 0010을 2의 보수로 변환하면 1101 + 1인 1110이다.



    즉, 1010 + 1110을 의미하는데 이 값은 11000이다.



    이때 11000의 의미는, 1 1000으로 해석 하면 되는데, 앞의 1은 음수이면 1, 양수이면 0이고



    뒤의 이진수는 그 값을 의미한다. 결국 -8이라는 것을 의미한다.

    10-2 인데 왜 -8인거죠..?

    • 가누 2019.07.20 13:19 신고

      감사합니다 정정하겠습니다
      2의 보수는 1110이 아닌
      111...111...11110이기에 10과 더하면 000...000...01000이 됩니다.
      따라서 8이 됩니다.

  3. 111 2020.03.27 11:17

    000...000...01000

    이 뭘 의미하는건지 잘 모르겠어요
    ... <- 이 점 세개가 계산을 의미하는 건가요?