본문 바로가기
Study/Computer

[기초] 2의 보수에 대해 알아보자!

by jamiehun 2023. 2. 15.

이진법에서 -1을 표현하려면 어떻게 해야할까요? (+2의 보수)

 

2진법에서 (-)값을 나타내면 어떻게 나타낼 수 있을까?

머리 속에 2의 보수의 개념이 떠다니긴 하지만 그것을 말로 설명하지 못한다면 메타인지가 제대로 안되어있다는 증거이다. (내가 그렇다..)

 

CSAPP 책을 보면서 2의 보수에 대한 개념을 접하였으나 

헷갈리기 쉬운 개념인만큼 차근차근 정리해보자

 

https://st-lab.tistory.com/189 

 

2진수의 수와 음수 표현법 [1의 보수와 2의 보수]

안녕하세요. 오늘은 프로그래밍이 아닌 컴퓨터의 연산에 대해 이해해보고자 합니다. 우리가 흔히 프로그래밍을 할 때는 그나마 사람에 가까운 언어로 된 고급언어들로 작성을 하지만 실제 컴퓨

st-lab.tistory.com

 

위의 블로그에 매우 자세하게 잘 설명되어 있다.

위의 블로그 내용을 토대로 개인적으로 이해한 바를 정리해보았다.

비약이 있긴 하지만 중요한 부분만 간추려볼려고 한다.

(아래는 개인적인 이해를 토대로 짧게나마 설명하는 글, 정확한 자료는 블로그 글 참고)

 

첫번째 방법, 최상위 비트를 이용하자

우리가 쉽게 아는 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의 문제 해결)

 

 

[참고]

https://st-lab.tistory.com/189

https://youtu.be/MlxJPWBdV0Q 

https://youtu.be/h2ktWG7vcJ4