행여나 보수 검색을 통해 들어왔다면 이 게시물이 글로 이루어 졌다고 뒤로가기를 누르지 않길 바랍니다.
보수를 모르는 사람 입장에서 상세히 적어 놓았으므로 한번 읽어보시길 바랍니다.
진법에 대하여 알아 보았으니, 이제 그 진법들을 이용하여 보수를 구하고, 값을 구하는 법을 알아본다.
우선 앞서서 보수는 왜 알아야 되는걸까?
컴퓨터에서 연산 시, 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 |