음 어떻게 표현 해야 할까 - eum eotteohge pyohyeon haeya halkka

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

  • 2021.01.01 21:27
  • 프로그래밍 기초

안녕하세요.  

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

그래서 이 번에는 컴퓨터의 기본 연산 중 가장 혼돈하기 쉽고 잘 못 배우면 어렵게 느껴지는 2진수의 표현법. 그 중 특히 보수(補數)에 대해 알아보고자 합니다.

만약 직전 포스팅인 '프로그래밍 언어와 빌드 과정'을 보셨다면 우리가 프로그램을 개발하기 위해 고급언어들로 작성한 소스코드들은 결과적으로 컴퓨터가 이해할 수 있는 언어로 번역된다고 했죠.

간단한 이유이지만, 컴퓨터는 근본적으로 0과 1밖에 모르기 때문입니다. 

좀 더 직관적으로 말하자면 전기적 신호로 전달 할 수 있는 방법이 On/Off 즉, 전류가 흐르는지 (=1), 안흐르는지(=0) 밖에 모른다는 것이죠. 그리고 이러한 신호들의 조합으로 여러 명령 체계를 만들어 사용하는 것이죠. 보통은 이러한 내용은 논리 회로에서 많이 다룰 겁니다.

그러면 본격적으로 2진수의 표현 방법들을 알아보기로 하죠.

⦁ 2진수의 수 표현법

 

아마 이 글을 보시는 대부분은 2진수가 무엇인지는 모두 알고 있을 겁니다.

예로들어 4bit에서 수를 표현한다면 이럴테죠.

0000(2) = 0

0001(2) = 1

0010(2) = 2

0011(2) = 3

0100(2) = 4

1110(2) = 14 

1111(2) = 15

여기서 한 가지 가장 큰 문제를 찾으라면 무엇이 있을까요?

우리가 10진수를 2진수로 해석하여 수를 표현하는데 아무런 문제가 없어보이지만, 조금만 생각해보면 우리가 쓰는 수 체계는 자연수(또는 양의 정수)만 존재하는 것이 아니죠. 엄연히 음의 정수도 수 체계에 포함되어있죠. 즉, 위 방식에서 가장 큰 문제라면 바로 음수를 표현 할 방법이 없다는 것입니다. 

그러면 어떻게 음수를 표현할까? 이에 대한 고민을 해보도록 하죠.

⦁ 부호 절대값 (Sign-Magnitude)

가장 쉽게 생각할 수 있는 방법은 최상위 비트(가장 왼쪽의 비트)를 이용하는 방법입니다.

보통은 int (32bit)자료형을 많이 사용하니 이를 기준으로 설명해보겠습니다.

예로들어 5를 표현한다고 가정해보죠. 이진수로는 다음과 같을 것입니다.

5(10) = 0000 0000 0000 0000 0000 0000 0000 0101(2)

만약 -5 를 표현한다고 한다면 어떻게 하면 될까요? 앞서 말했듯 최상위 비트(가장 왼쪽의 비트)를 이용한다고 했죠.

0일 때는 양수, 1일 때는 음수라고 약속하고 이를 이용하면 됩니다. 즉, 5(10)에서 가장 왼쪽의 비트를 바꿔주는 것입니다. 

-5(10) = 000 0000 0000 0000 0000 0000 0000 0101(2)

이렇게 최상위 비트를 이용하는 방식을 이용하면 음수를 표현 할 수 있죠. 이 때 최상위 비트를 MSB(Most Significant Bit) 라고도 합니다.

(만약 비트가 아닌 바이트, 즉 Most Significant Byte 와 혼용할 경우 보통은 MSBit, MSByte 이렇게 구분지어서 말하기도 합니다.)

최상위 비트를 부호 절대값으로 사용하는 방식은 매우 직관적이면서 쉬우나 컴퓨터 입장에서는 여러모로 불편한 점들이 있습니다. 간단하게 4bit로 음수와 양수를 표현한다고 한다면 다음과 같습니다.

음 어떻게 표현 해야 할까 - eum eotteohge pyohyeon haeya halkka

일단 직관적으로 보이는 것은 0이 양수와 음수로 나뉘어진다는 단점이 있죠.

하지만 이 것 말고 가장 큰 단점은 뺄셈을 위해 각 수가 음수 또는 정수냐에 따라 고려하여 구현해야 할 것이 많다는 것입니다. 

우리는 10진법 체계에 익숙해져있고 음수의 덧셈에서도 쉽게 정답을 도출할 수 있지만, 컴퓨터는 그렇지 않습니다.

기본적으로 이진수의 덧셈은 다음과 같습니다. 예로들어 23 + 31을 더한다고 하면 아래 그림과 같죠.

음 어떻게 표현 해야 할까 - eum eotteohge pyohyeon haeya halkka

이렇게 양수끼리의 덧셈은 크게 문제가 없어보입니다.

그럼 음수의 덧셈은 어떻게 할까요? 만약 최상위 비트를 양, 음의 수로 쓴다고 하죠.

두 수의 덧셈에서 음수가 껴있는 경우는 3가지가 있을 겁니다. 두 수 모두 음수인 경우, 첫 번째 수만 음수인 경우, 두 번째 수만 음수인 경우 이렇게요.

먼저 두 수 모두 음수인 경우는 어떨까요? 앞서 23과 31을 썼으니 이 수를 갖고 예제를 들어보도록 하죠.

23과 31이 모두 음수 일 때, 즉 -23과 -31의 덧셈은 -23 -31 = -54 이라는 건 모두가 알 것 입니다.

좀 더 편하게 계산하기 위해 정리하자면 -(23 + 31) = -54 이렇게 볼 수 있겠죠?

그림으로 보면 이렇겠네요.

음 어떻게 표현 해야 할까 - eum eotteohge pyohyeon haeya halkka

이 부분은 쉽게 구현이 가능할 것 같아요. 두 수의 최상위 비트가 같다면 결과값의 최상위 비트도 같아지는 것을 볼 수 있죠. 나머지 비트들을 덧셈을 한 뒤 최상위 비트만 그대로 내려오면 되니깐요.

문제는 다음부터입니다.

먼저 첫 번째 수가 음수일 경우는 어떻게 될까요?

-23 + 31 = 8 인 것은 쉽게 알 수 있지만 2진수로 표현한다면 하나 문제가 생깁니다.

바로 첫 번째 수의 절대값이 두 번째 수의 절대값보다 작을 경우입니다. 왜 그런지는 한 번 그림을 보면 바로 알 수 있습니다.

음 어떻게 표현 해야 할까 - eum eotteohge pyohyeon haeya halkka

위에서 이진수의 덧셈을 하면 54가 나와버리죠? MSB에 따라 +-를 붙여주더라도 올바른 답을 얻을수가 없죠.

그렇다고 31을 빼버리게 되면 -23에서 MSB를 제외한 나머지 비트에서 31을 빼주어야 하는데 그러면 음수에서의 뺄셈을 따로 구현해주어야 하죠.

쉽게 생각해서 0001(2) 에서 0010(2)를 빼야한다면 그 과정이 복잡해진다는 것이죠. 

그렇다면 해결방법이 없는걸까요? 아닙니다.

위와같은 경우에는 가장 쉽게 해결할 수 있는 방법이 바로 '절대값이 큰 수가 첫 번째 수'가 되도록 하면 됩니다. 

-23과 31 중 절대값이 큰 것은 바로 31입니다. 즉, -23+31 에서 순서를 바꾸어 31-23으로 만들어 주면 된다는 것이죠.

음 어떻게 표현 해야 할까 - eum eotteohge pyohyeon haeya halkka

반대로 23이 양수고 31이 음수인 -31이라면 어떻게 될까요? 약간은 다른 방법이 필요한데, 일단 큰 값에서 작은 값으로 빼주는 방식을 취하는 것은 같습니다.

(23 - 31) = - (31 - 23) 과 같죠?

여기서 31에 23을 빼준 뒤, 그 결과 값에 음수를 취해주면 됩니다. 즉, 큰 수가 앞에 오게 만들고 앞서 했던 뺄셈을 한 뒤 마지막에 MSB만 음수를 붙이면 됩니다.

음 어떻게 표현 해야 할까 - eum eotteohge pyohyeon haeya halkka

이렇게 말이죠.

이 방식이 사람한테는 쉬운 것 처럼 보이지만 막상 회로로 만들려고 하면 모든 경우의 수를 고려하여야 하기 때문에 마냥 쉬운 방식은 아니죠. 특히 음수가 껴있을 때는 각 상황마다 MSB를 어떻게 처리해야 하는지, 어떤 수가 첫 번째 수가 되어야하는지 고려해야 할 것이 너무 많아져버리죠.

장단점을 정리하자면 이렇습니다.

[장점]

1. 최상위 비트만 고려해주면 되기 때문에 사람입장에서는 직관적이다.

[단점]

1. +0 과 -0 둘 다 존재하기 때문에 둘 다 0으로 인식하도록 설정해야한다.

2. 연산에서 고려해야할 것이 많아져 회로가 복잡해지고 많아진다. (MSB와 절대값을 각각 계산해야한다.)

⦁ 1의 보수 (One's Complement)

먼저 1의 보수를 설명하기 전에 보수가 무엇인지 알아보고 가보는 것이 좋습니다.

보수는 쉽게 풀어쓰면 '보충해주는 수' 입니다. 한문으로 쓰면 補數 인데 補는 '도울 보'로 흔히 보좌관, 보조 등 어떤 걸 보충해주는 의미로 쓰이죠. 數 는 '셈 수'로 말 그대로 수(셈)를 의미합니다.

그럼 무엇을 보충해주냐! 어떤 수를 만들기 위해 필요한 수를 의미합니다.

그리고 보수는 각 n진법마다 모두 존재하는데, n진법에는 n의 보수와 n-1의 보수가 쓰입니다. 이 이유는 차차 설명드리기로 하고 먼저 이해하기 쉽게 10진법으로 예를들어보죠.

3에 대한 '10의 보수' 라고 한다면 '3에서 10을 만들기 위해 필요한 수'를 의미하는 것입니다. 그러면 정답은 7이 되겠죠. 또한 12에 대한 '10의 보수' 라고 한다면 12에서 100을 만들기 위해 필요한 수는 88입니다.

느낌이 오시나요?

쉽게 말하면 'n의 보수'는 '어떤 수에 대해 n의 제곱수가 되도록 만드는 수'라고 보시면 될 거 같습니다.

예로들어 17에 대한 10의 보수라고 한다면 17을 10으로 만든다는 것이 아니라 10의 제곱인 100을 만들기 위한 수로 100-17 = 83 즉, 83이 보수가 되는 것입니다. 음수가 되지 않는 선에서의 n의 최소 제곱수가 되는 것이죠.

그리고 n진법에는 n의 보수와 n-1, 즉 10진법에는 10의 보수와 9의 보수가 쓰인다고 했죠?

n진법에서의 n-1의 보수는 (n의 보수 - 1)이 됩니다.

좀 더 쉽게 말하면, 10진법에서 9의 보수는 10의 보수 - 1 이 된다는 것이죠.

17에 대한 10의 보수는 83이었죠? 여기서 -1을 한 값. 즉, 82가 9의 보수라는 것입니다.

17에 대한 9의 보수 = (100 - 17) - 1 = 83 - 1 = 82 이 식을 조금만 바꾸어 말하자면 

(100 - 1) -17 = 99 - 17 = 82 이렇게 될 수도 있습니다.

자. 그럼 생각해보죠. 10의 보수에서 -1 을 하면 9의 보수가 나왔다는 것은 9의 보수를 구한 값에 +1 을 하면 10의 보수가 된 다는 것과 같은 의미죠?

예로들어 10진법에서 723을 10의 보수와 9의 보수 모두 구한다고 가정해봅시다. 그럼 두 가지 방식으로 구할 수 있죠.

[방법 1]

(1000 - 723) = 277 (10의 보수)

277 - 1 = 276 (9의 보수)

[방법 2]

999 - 723 = 276 (9의 보수) 

276 + 1 = 277 (10의 보수)

두 번째 방식을 보면 결국 n진법의 n-1 의 보수는 음수가 되지 않는 선에서 n-1로 채운 수가 되는 것이죠. 이 방법이 왜 쓰이는지는 다른 진법에서 보면 바로 이해 될 것입니다.

예로들어 8진법에서는 어떨까요? 8진법에서의 723(=10진법으로는 467(10) 입니다.)을 8의 보수와 7의 보수 모두 구한다면 이럴겁니다.

[방법 1]

(1000(8)-723(8)) = 55(8) (-723의 8에 대한 보수)

55(8) - 1(8) = 54(8) (-723의 7에 대한 보수)

[방법 2]

777(8) - 723(8) = 54(8) (-723의 7에 대한 보수)

54(8) + 1(8) = 55(8) (-723의 8에 대한 보수)

보면 방법 2가 훨씬 쉬운 것을 볼 수 있죠? 

보수의 원리에 대해 알아봤다면 그러면 대체 보수를 왜 사용하느냐를 생각해보아야 하겠죠? 앞서 부호 절대값을 이용하여 음수(뺄셈)을 이용하는 경우 고려해야 할 점이 많다고 했죠.

보수를 이용하여 뺄셈을 할 수가 있는데, 바로 이 점이 컴퓨터 입장에서 좀 더 쉽고 일관되게 쓸 수 있다는 것입니다.

한마디로 음수, 양수 상관없이 일관되게 덧셈만으로도 결과값을 얻기 위해 쓰이게 됩니다.

앞선 부호 절대값에서 문제가 되었던 -23 + 31을 예로 들어보죠.

음수(뺄셈)인 -23을 보수로 취하고 풀이하면 이렇게 답을 얻을 수도 있습니다.

{(100-23)+31}-100

= {77+31}-100

= 108-100

= 8

수학적으로는 위와같이 풀이하여 답을 구할 수 있죠.

이를 조금 응용하여 '보수'만 구해주는 방식으로 변형할 수 있습니다. 위에서는 보수를 구하기 위한 100이 더해진만큼 다시 빼주었는데 그냥 보수를 구하기만 하고 다시 빼지는 않는다는 것이죠.

{(100-23)+31}

= {77+31}

= 108

여기서 가장 왼쪽 값 1은 올림으로 발생한 수이기 때문에 이를 버립니다. 이를 최상위비트(MSB)에서 '자리 올림'이 되었다는 의미로 '캐리 발생'이라고도 합니다. 이 때 중요한 점은 '자리 올림' 즉, 캐리가 발생 할 경우 '양수'라는 의미이고, 캐리가 발생하지 않는 경우 '음수'라는 의미입니다.

정리하자면 108에서 1이라는 수를 버린 08, 즉 8이 정답이 되죠. -23+31=8과 정답이 같죠?

-23 + 31의 보수를 이용한 것을 단계별로 정리하면 이렇습니다.

1. 음수에 대해 보수 구하기 : (100-23) = 77

2. 구한 보수 값에 나머지 수 더하기 : 77 + 31 = 108

3. 올림이 발생할 경우 해당 수는 버림 : 08

더보기

만약 올림이 발생하지 않는 경우. 예로들어 -31 + 23 의 경우는 다음과 같습니다.

 수학적으로는 이렇게 풀이될 수 있죠.

1. {(100-31) + 23} - 100

2. {69 + 23} - 100

3. 92 - 100

4. -8

이를 조금 응용한 형태로 풀면 이렇습니다.

1. {(100-31) + 23}

2. 69 + 23

3. 92 

 여기서 중요한 점이 세번째 단계입니다. 만약 캐리가 발생하지 않았다면, 그 수를 다시 보수를 구해주어 얻어진 값에 음수 부호를 붙이면 됩니다.

4. 100-92 = 8

5. -8

두 수 모두 음수 일 경우는, 예로들어 -23 -31 같이 된다면 이는 -(23+31) 과 같은 것이죠.

1. {(100-23) + (100-31)} - 200

2. = {77 + 69} - 200

3. = 146 - 200

4. = -54

응용한다면 보수가 두 개 있기 때문에 캐리 여부 또한 2번 확인해야합니다.

(-23) + (-31)

= (100-23) + (100-31)

= 77 + 69

= 146   캐리가 발생했으므로 왼쪽자리 버림 

= 46    캐리가 발생하지 않음

= 100-46 = 54

= -54

쉽게 정리하자면 보수를 더해서 올림이 발생하면 결과는 양수이고 올림 수는 버린다.

올림이 발생하지 않으면 결과는 음수이고 계산 결과값의 보수 값이 최종 값이 된다.

9의 보수를 이용하면 어떻게 될까?

앞서 말했듯 9의 보수는 10의 보수 - 1이라고 했습니다.

예로들어 두 가지 케이스를 보면 이렇죠.

1.) 23-31

= 23 + (99-31)

= 23 + 68

= 91   ⇐  올림이 발생하지 않았으므로 9의 보수를 구한 값의 음의 부호를 붙인다.

= 99 - 91

= 8

= -8

2.) -23+31

= (99-23) + 31

= 76 + 31

= 107   ⇐  올림이 발생했으므로 올림이 발생한 자리값 버림

= 07

= 7 + 1   ⇐ 10의 보수로 변환하기위해 +1을 해줌 (9의 보수는 10의 보수 - 1 이었기 때문) 

= 8

이렇게 뺄셈을 용이하게 할 수 있게 됩니다.

그래서 조금만 생각해보면 왜 보수가 필요한지, 1의 보수와 2의 보수가 있는지 알 수 있을 겁니다. 바로 2진법에서의 뺄셈과 뺄셈을 위한 2진법에서의 보수를 구하기 위해 있다는 것이죠.

하지만 다른 진법, 즉, N진법에서는 N-1의 보수를 구해서 쓰는게 더 편하다고 했었죠?

그래서 2진수에서의 2의 보수 전에 1의 보수부터 구해본 겁니다.

예로들어 2진수 7자리(+MSB 1자리) (=총 8bit)

0000 0011(2)(=3(10)) 의 2의 보수는 1 0000 0000(2)-0000 0011(2) = 1111 1101(2) 이렇게 구할 수도 있지만, 비트가 한정 되어있는 경우 보수를 구하는 과정에서 +1 비트 한 칸이 더 필요하고, 거기에 내림을 해야하기 때문에 실질적으로는 9bit가 필요하게 되어버리는 것이죠.

3이라는 수의 1의 보수를 구해보면 이렇죠.

1111 1111(2) - 0000 0011(2) = 1111 1100(2)

이렇게 좀 더 편리하게 1의 보수를 구할 수 있습니다. 즉, 3을 뺄셈할 때(= -3) 위의 수를 이용할 수 있다는 것입니다. 이를 이용해서 위에서 설명한 10진수의 9의 보수를 이용한 뺄셈처럼 같은 원리를 적용하여 계산 할 수 있게 되죠.

그리고 가장 중요한 점이 있습니다. 1의 보수를 구해보면 알겠지만 1의 보수 방식에서 음수는 양수의 비트를 반전시킨 값입니다.

앞서 보면 알겠지만, 3을 이진수로 나타내면 0000 0011 이었죠? 이 비트를 반전(NOT) 연산을 하면 1111 1100 이고, 이 것이 -3의 비트가 되는 것이죠.

잠깐 표를 보도록 하죠! (32bit로 쓰면 수가 길어지니 8bit를 기준으로 보여드리겠습니다.)

음 어떻게 표현 해야 할까 - eum eotteohge pyohyeon haeya halkka

이렇게 1의 보수를 이용하여 만들었더니 비트만 반전하면 된다는 장점을 얻었습니다.

1의 보수 방식을 통해 부호 절대값에서 문제가 되었던 부호와 절대값을 따로 계산할 필요가 없어지고 뺄셈 대신 음수를 더하기만 해주면 된다는 장점이 생겼습니다.

다만 후술할 것이지만, 1의 보수 방식도 단점은 있습니다. 10의 보수와 9의 보수에서도 설명했지만, N-1 의 보수는 캐리(올림)이 발생하면 +1을 더해주어야 한다고 했죠.

다시 23과 31 두 수를 이리저리 계산해봅시다. 32bit 기준입니다.

[23 + 31]

음 어떻게 표현 해야 할까 - eum eotteohge pyohyeon haeya halkka

양수끼리의 덧셈은 어렵지 않게 잘 됩니다.

[-23 + 31]

음 어떻게 표현 해야 할까 - eum eotteohge pyohyeon haeya halkka

위에서 보다시피 -23의 비트를 더해주면 MSB자리을 넘어서 올림이 발생합니다. 그럴 때는 계산 값에 +1을 해주면 되는 것이죠. 즉, 1의 보수에서 캐리가 발생했으니 +1을 해주는 원리입니다. 

[-23 -31]

음 어떻게 표현 해야 할까 - eum eotteohge pyohyeon haeya halkka

이 것도 마찬가지로 캐리가 발생하죠? 즉, +1을 해주면 알맞은 값이 나오게 됩니다.

[23-31]

음 어떻게 표현 해야 할까 - eum eotteohge pyohyeon haeya halkka

이 경우는 캐리가 발생하지 않는군요. 

이렇게 비트를 더해주어도 MSB가 1일경우는 음수, 0일경우는 양수를 유지하면서도, 캐리가 발생할 경우에만 +1을 해주면 되기 때문에 여러모로 편리해보이기도 합니다.

그런데 여전히 문제점이 남아있는게 있습니다. 앞서 말했던 캐리가 발생할 경우를 처리해주어야 함과 +0과 -0이 존재한다는 것입니다.

그리고 계산해보면 알겠지만 0이 나오는 결과는 항상 -0. 즉, 1111 1111 ⋯ 1111 이 나온다는 겁니다. 당연한 말이지만, 어떤 수 N의 비트를 뒤집은 것이 -N이기 때문에 둘을 더하면 모든 비트가 1이 되어버리죠.

1의 보수 방식의 장단점을 정리하자면 이렇습니다.

[장점]

1. 비트만 반전시키면 음수값을 얻을 수 있다.

2. MSB의 성질이 유지가 된다.

3. 덧셈만으로 뺄셈을 구현할 수 있어 비교적 회로가 단순해진다.

[단점]

1. 캐리가 발생하는 경우를 처리해주어야 한다.

2. -0과 +0을 모두 인지할 수 있도록 처리해주어야 한다.

⦁ 2의 보수 (Two's Complement)

1의 보수를 사용하면 -0 +0 둘다 있고, 캐리가 발생하는 경우에 따라 +1을 해야하는 것을 고려해야했죠. 그러면 아주 간단한 방법은 무엇일까요? 간단합니다. -0을 없에면 됩니다.

즉, 음수 영역에서 각 대응되는 수를 -1 씩 대응시키는 것이죠.

음 어떻게 표현 해야 할까 - eum eotteohge pyohyeon haeya halkka

음수 영역에서 각 대응되는 수를 -1씩 대응시켰다는 말은 어떤 수에서 a라는 수를 뺄 때 a에 대한 2의 보수는 1의 보수 +1 이라는 것과 같은 말입니다.

무슨 말인지 조금 어려워 보입니다만, 조금만 생각해보면 그리 어렵지 않습니다.

1에 대해 -1을 표현하기 위해 1의 보수를 이용하면 비트를 반전시키면 된다고 했었죠?

2-3 을 연산하려고 할 때, 뺄셈 대신 음수를 더하는 방식을 사용하기 위해 보수를 이용하는데, -3을 하기위한 3에 대한 1의 보수는 0000 0011(2) 비트를 반전시킨 1111 1100(2) 였죠.

하지만 위 2의 보수를 이용한 음수를 표현하는 표에서 1111 1100(2) 는 -3이 아닌 -4입니다. 만약 -3을 표현하고자 한다면 -4에 +1을 해주어야 겠죠.

즉, 부호를 바꾸기 위해서는 1의 보수 방식에서 +1을 한 값이 2의 보수 방식인 것이죠.

쉽게 말하면 이렇습니다.

"어떤 수를 부호를 바꾸고자 한다면 비트를 반전시킨 뒤 1을 더하면 된다"

그러면 일단은 -0의 문제가 해결 된 것 같군요. 문제는 캐리 발생 여부에 따라 추가 작업이 필요한 것이 해결이 되었느냐겠죠? 신기하게도 해결이 됩니다.

다시 23과 31을 갖고와서 4가지 경우를 보도록 해보죠.

[23+31]

음 어떻게 표현 해야 할까 - eum eotteohge pyohyeon haeya halkka

양수끼리의 덧셈이야 문제 될 것은 없죠.

[-23+31]

음 어떻게 표현 해야 할까 - eum eotteohge pyohyeon haeya halkka

여기서 보면 캐리가 발생하더라도 올바른 값이 나옵니다. 

[-23-31]

음 어떻게 표현 해야 할까 - eum eotteohge pyohyeon haeya halkka

여기에서도 마찬가지로 캐리가 발생하지만 별 다른 조치 없이도 올바른 수가 나오죠.

[23-31]

음 어떻게 표현 해야 할까 - eum eotteohge pyohyeon haeya halkka

여기서는 캐리가 발생하지 않는군요.

위에서 보다시피 캐리가 발생하더라도, 즉 비트가 밀린 값이 버려지고 아무런 조치를 안취하더라도 올바른 값이 나오게 되는 것 볼 수 있습니다.

이렇게 2진수에서는 컴퓨터가 연산을 더욱 편리하게 하기 위해 2의 보수를 활용하여 쓰는 것이죠.

실제로도 대부분의 컴퓨터는 2의 보수를 활용한 방식을 택하고 있습니다. (정확히는 CPU의 구성요소인 ALU에서 담당하고 있습니다. 참고로 ALU는 산술논리장치(Arithmatic Logic Unit)의 줄임말입니다.)

여러분이 만약 시험문제 같은 것에서 어떤 수의 2의 보수를 구하라고 한다면, 해당 수(이진수)의 비트를 반전 시킨 뒤 1을 더하면 됩니다.

5를 2진수에서의 2의 보수를 구하라고 한다면 5(10) = 0101(2) 이고, 이 비트를 반전시키면 1010(2) 이라는 1의 보수를 얻고 여기에 1을 더한 값. 즉, 1011 이 정답이 되는 것이죠. 그리고 1011 에 대응 되는 10진수는 -5가 되는 것입니다.

2의 보수 방식의 장점을 정리하자면 이렇습니다.

[장점]

1. 1의 보수에 +1을 하면 음수값을 얻을 수 있다.

2. MSB의 성질이 유지가 된다.

3. 덧셈만으로 뺄셈을 구현할 수 있어 회로가 단순해진다.

4. 1의 보수의 단점(캐리 발생 문제 및 0이 두 개) 모두 해결이 된다.

⦁ 정리하기

이렇게 3가지 방식의 2진수 표현 방법을 알아보았습니다.

인간의 입장에서는 뺄셈하는 방식이 단순해보이더라도 On/Off 즉, 0과 1로 이루어진 2진법 안에서는 뺄셈을 구현하는 것이 매우 번거롭다는 것을 알 수 있죠.

비록 우리 눈에는 2의 보수 개념이 어려워 보일 수 있으나 컴퓨터는 그렇지 않다는 것이죠.

아마 기억하기에는 주판이나, 초등학교 때 뺄셈 덧셈을 처음 배울 때 보수의 개념을 사용하긴 하지만, 요즘에는 주판도 보기 힘들 뿐더라 아마 덧셈 뺄셈을 배웠던 때는 워낙 어릴 때라 기억이 없을 수도 있을 겁니다.

아무쪼록 우리가 다루는 컴퓨터는 어떻게 연산을 하는지를 좀 알아두었으면 하는 바램도 있고 아마 이 개념을 확실하게 이해하고 가면 로직과 관련있는 수업이나 시험들(논리회로 같은..?)에서 도움이 많이 되실 것 같아 조금은 어렵지만 이렇게 포스팅 하게 되었습니다.

이해가 잘 되었으면 하는 바램입니다. 만약 어려운 부분이 있다면 댓글을 남겨주시면 감사하겠습니다 :)