반응형

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


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




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


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


컴퓨터에서 연산 시, 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을 더하고 +값을 도출하고,


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

반응형

'Applied > Hacking and Security' 카테고리의 다른 글

DES 암호 알고리즘  (7) 2018.03.20
RSA 암호 알고리즘  (9) 2018.03.14
진법 변환  (2) 2016.10.20
콘솔창에서의 인터넷 창 테러  (0) 2016.08.14
윈도우 메세지 후킹(Window Message Hooking)  (5) 2016.08.01