이진법에서 -1을 표현하려면 어떻게 해야할까요? (+2의 보수)
2진법에서 (-)값을 나타내면 어떻게 나타낼 수 있을까?
머리 속에 2의 보수의 개념이 떠다니긴 하지만 그것을 말로 설명하지 못한다면 메타인지가 제대로 안되어있다는 증거이다. (내가 그렇다..)
CSAPP 책을 보면서 2의 보수에 대한 개념을 접하였으나
헷갈리기 쉬운 개념인만큼 차근차근 정리해보자
https://st-lab.tistory.com/189
위의 블로그에 매우 자세하게 잘 설명되어 있다.
위의 블로그 내용을 토대로 개인적으로 이해한 바를 정리해보았다.
비약이 있긴 하지만 중요한 부분만 간추려볼려고 한다.
(아래는 개인적인 이해를 토대로 짧게나마 설명하는 글, 정확한 자료는 블로그 글 참고)
첫번째 방법, 최상위 비트를 이용하자
우리가 쉽게 아는 2진법에서는 음수 표현을 어떻게 할까?
가장 쉽게 생각할 수 있는 방법은 가장 왼쪽의 비트를 이용하는 것이다.
예를 들어 8비트의 17일 때는
+17 = 0001 0001
-17 = 1001 0001
사람에게 있어서 매우 직관적이고 파악하기가 쉽다.
하지만 이것들을 연산할 때는 어떻게 하면 될까?
맨 앞에 있는 MSB(Most Significant Bit)를 처리하기가 애매하다..
(1000 0000 혹은 0000 0000?, 즉 -0과 0)
앞 뒤의 숫자가 다를 경우 좀 더 고려해야할 점이 많은데
-18 +17의 경우
-18 = 1001 0010
17 = 0001 0001
답이 1000 0001 이 되어야 하는지, 0000 0001이 되어야하는지 정확하게 파악이 불가하다.
이 경우에는 -(18 - 17) = -1 과 같은 방식으로 큰 수로 작은 수를 빼주고 전체를 마이너스 씌워주는 것이 가장 최선인 듯하다.
두번째 방법, 1의 보수를 이용하자
컴퓨터가 연산을 할 때는 가산기의 개념이 사용되므로 보수의 개념이 나온다.
(On/Off로 이루어진 2진법에서 뺄셈을 구현하는 것은 매우 번거로운 일이고 그래서 가산기의 개념이 사용된다.)
보수는 '보충해주는 수'라는 의미인데, 어떤 수를 만들기 위해 필요한 수이다.
이 보수의 개념을 쓰면 가산만으로도 (-) 연산이 가능해진다.
'n의 보수'는 '어떤 수에 대해 n의 제곱 수가 되도록 만드는 수'이고,
n진법에서 n-1의 보수는 (n의 보수 -1) , n의 보수는 ((n-1)의 보수 + 1)이 된다. -> 아주 유용하게 쓰인다.
1의 보수의 특징을 간단하게 요약해보자면,
양수를 음수를 만들기 위해서는 양수의 비트를 반전시키기만 하면 되고, 덧셈만으로도 뺄셈을 구현할 수 있다.
예를 들어 1은 0000 0001이고, -1은 1111 1110이다.
하지만 여기서도 0과 -0의 값은 존재한다. (0000 0000, 1111 1111)
또한 캐리라는 개념이 나오는데 캐리가 발생하는 경우 캐리를 따로 처리해줘야하기 때문에 연산을 하는데 조금의 시간이 더 든다.
1의 보수를 얘기하는 이유는 위에서 말한
'n진법에서 n-1의 보수는 (n의 보수 -1) , n의 보수는 ((n-1)의 보수 + 1)이 된다.' 를 사용하기 위해서인데,
2의 보수에서 이 개념을 사용하면 뺄셈을 할 때 좀 더 수월하게 연산을 할 수 있다.
세번째 방법, 2의 보수를 이용하자
대부분의 컴퓨터는 이 2의 보수를 이용해서 연산을 하고 있다. (CPU의 ALU, 산술 논리장치)
2의 보수에서 1의 보수를 활용하면 음수값을 보다 쉽게 구할 수 있다.
예를 들어, +1은 0000 0001이고, -1은 1111 1110 (1의 보수에서의 (-1)) +1 만 해주면 되므로 1111 1111이 -1 값이 된다.
또한 +0만 존재를 하는데, 예를 들어 -0을 구한다고 하면 (1111 1111 (1의 보수에서의 -0))에 +1을 해주면
1 0000 0000 값이 나오고 캐리 값은 버려지게 되므로 0000 0000의 값이 나오게 된다.
물론 2의 보수에서도 캐리가 발생하긴 하지만 1의 보수와는 달리 이 값을 따로 처리하지 않아도 되고,
1의 보수를 활용해서 좀 더 손쉽게 음수 값을 구할 수 있다.
또한 음수의 값을 양수로 변환시킬 때도 1의 보수 개념을 활용해서 양수를 구하면 된다.
예를 들어, -128의 경우 1000 0000이 되는데,
1의 보수를 활용해서 비트를 반전시키고, (0111 1111)
+1을 해준다면 1000 0000 = 128의 값이 되는 것을 알 수 있다.
정리해보자.
이진법에서 -1을 표현하려면 총 세가지의 방법이 있다. (8비트 기준)
첫번째, MSB를 활용하면
0000 0001 -> 1000 0001만 해주면 된다. (가장 직관적이나 연산에는 힘듦)
두번째, 1의 보수 개념을 활용하면
0000 0001 -> 1111 1110 으로 만들어진다. (비트를 뒤집기만 하면 되나 연산에 사용하기에는 불편(캐리, 0과 -0)
마지막으로, 현재 컴퓨터가 사용하는 2의 보수 개념을 활용하면
0000 0001 -> 1111 1110 + 1 -> 1111 1111으로 만들어진다. (1의 보수 개념을 응용, 연산에 활용하기 좋음 (캐리와 0,-0의 문제 해결)
[참고]
'Study > Computer' 카테고리의 다른 글
[OS] 메모리 관리 (메모리할당, 단편화, swapping, segmentation) (0) | 2023.03.18 |
---|---|
[OS] Blocking, Non-blocking, Sync, Async 개념 (굳이 4등분?) (2) | 2023.03.15 |
[OS] 스케쥴러와 CPU 스케쥴링 (0) | 2023.03.12 |
[기초] RESTful API란 무엇일까? (0) | 2023.03.01 |
크롬 개발자도구 알아보기 (0) | 2023.02.09 |