본문으로 바로가기

파일의 IT 블로그

  1. Home
  2. 프로그래밍 강좌/C
  3. [C언어 강좌] #5-2 [2진수 변환, 1의보수, 2의보수 원리 설명]

[C언어 강좌] #5-2 [2진수 변환, 1의보수, 2의보수 원리 설명]

· 댓글개 · KRFile

안녕하세요 파일입니다. 연산자를 설명하기 전에 생각해보니 2진법 변환 과정을 모르면 전혀 이해가 안 되실 거 같아서

한번 설명을 하겠습니다. 오늘 내용은 조금 난이도가 있습니다. 약간 수학적인 개념이 필요합니다.

 

최대한 쉽게 적어 보려고 노력했으니 꼭 끝까지 정독해주셔야 다음 강의 때 이해가 됩니다.

글의 요지는 강의라기 보다 제가 이해한 것들을 적어놓은 노트라고 생각해주시면 편할 거 같습니다

그래서 오류가 있을 수 있으니 글에 오류가 있으면 댓글로 정정 부탁드립니다!!

 

10진수 2진수로 바꾸기

우선 진법이란 사용할 수 있는 숫자의 개수자리값을 정의해주는 수 체계입니다.

우리가 흔히 사용하는 진법은 10진법입니다. 

이름이 10진법인건 0~9까지 10개의 숫자를 이용하기 때문인데요.

우리 손가락이 10개 인 것과 밀접한 연관이 있다고 합니다. 

 

 

549라는 숫자를 생각해볼까요? 549라는 숫자는 백의 자리5, 십의 자리 4, 일의 자리 9로 구성되어 있습니다.

10 진법에서 각 자리 값은 10의 제곱 꼴로 나타냅니다. 

549는 각 자리의 숫자와 자리값을 곱한갑으로 이루어집니다

즉 549는 5 x $10^2$ + 4 x $10^1$ + 9 x $10^0(1)$ 가 되게 됩니다.

 

이에 착안하여 숫자를 10으로 나눠보면 549가 10진수로 어떻게 표현되는지 이해할 수 있습니다.

이렇게 10으로 계속해서 나누고

나머지만 거꾸로 올라가면서 써보면 549라는 결괏값이 나옵니다.

 

그럼 컴퓨터에서 사용하는 2진법은 어떨까요?

컴퓨터는 전기적 신호인 ON(1)과 OFF(0) 즉 0과 1의 두 가지 신호만을 이용해서 숫자를 표기합니다.

 

우리가 사용하는 10진법은 0~9까지의 숫자인데 컴퓨터에선 0~1까지 밖에 없습니다.

10진수 1까진 표기가 가능하지만 10진수 2의 경우에는 조금 다르게 표기해야 합니다.

 

아까 10진법에서 각 자리 값은 $10^n$ 꼴로 나타낸다고 했으니 2진법에서는 $2^n$ 꼴로 나타낼 것입니다.

즉 10진수 2를 2진수에서 표현하려면  10 이 될 겁니다. (10진수의 10이 아님)

 

왜냐하면 ($2^1$ x 1) + ($2^0$ x 0) = 2 가 되기 때문입니다.

각 자리의 숫자와 자리값을 곱한 것인데 자리값이 $2^n$ 꼴이 됐다는 차이밖에 없습니다.

 

이것이 헷갈리면 위에 10진법처럼 나눠보면 됩니다. 2진법이니 2로 나눠봐야겠죠?

10을 한번 2진수로 바꿔보겠습니다.

 

2로 계속해서 나누고.. 나머지만 택하면 1010 이 나오네요! 10 진수 10을 2진법으로 바꾸면 1010입니다.

 

제대로 계산했는지 확인해볼까요?

$2^3$ x 1 + $2 ^ 1$ x 1 (0은 생략함) = 10

이런 식으로 자릿수와 함께 계산해보니 딱 맞아떨어지네요.

 

조금 더 확장해서 생각해보면 어떤 수를 n진법으로 변환하려면 그 수를 0이 될 때까지 n으로 나누고 나머지를 

거꾸로 읽어서 올라가면 됩니다.

 

위의 사진의 경우에는 10을 0이 될 때까지 2로 나누면 01010인데 앞에 0은 의미가 없어서 저기까지 계산했습니다.

 

 

2진수의 덧셈

 

2진수의 덧셈은 10진수처럼 자리올림이 적용됩니다

 

0 + 1 = 1

1 + 1 = 10 (10 진수의 2)

1 + 1 + 1 = 11

1 + 0 = 1

0 + 0 = 0

 

1 + 1에서 자리올림만 생각하면 2진수의 덧셈은 간단합니다

 

다음은 2진법 7과 3의 덧셈입니다.

0 1 1 1

7을 2진수 표로 나타내면 이런 식으로 되는데 저 표 한 칸에 0과 1이 들어갈 수 있고 이를 1bit라고 합니다. 참고로 8bit=1byte입니다. 

7이라는 정수를 컴퓨터에서 4bit로 표현했습니다. 

원래 2진수 인지 알려주기 위해 ⑵ 를 사용하는데 2진수 옆에 써줘야 하지만 이해를 돕기 위해 저렇게 썼습니다.

 

2진수의 뺄셈

덧셈은 쉬웠는데 뺄셈이 문제입니다.. 제일 문제는 컴퓨터는 덧셈밖에 못하는 바보라는 겁니다.

그러면 뺄셈, 곱셈, 나눗셈은 도대체 어떻게 하고 있는 걸까요?

 

결론부터 말하자면 컴퓨터는 보수의 개념을 이용하여 뺄셈을 처리하고

곱셈, 나눗셈은 이 뺄셈과 덧셈을 이용하여 하고 있습니다. 3 x 6 은 결국 3을 6번 반복해서 더하면 되니깐요.

 

9 - 6을 생각해봅시다. 9 - 6 = 3입니다. 그렇죠?

그런데 6을 보수 처리해봅시다. 보수는 말 그대로 보충을 해주는 수입니다.

1에 대한 10의 보수는 9고 1에 대한 9의 보수는 8입니다.

 

그러면 6에 대한 10의 보수는 4입니다

그리고 그것을 바로 더해보면 9 + 4 = 13입니다. 그런데 앞의 자리올림을 무시하면 13 -> 3 이 되어

결국 처음에 뺄셈을 한값과 동일해집니다. 

이게 컴퓨터 계산에 보수를 사용하는 이유입니다. 덧셈으로 뺄셈을 했거든요. 

 

즉 5 - 3 은 우리가 보기에 바로 2라는 값이 나오지만 컴퓨터는 5 + (-3)처럼 계산을 하는 겁니다

 

그리고 2진수에서 음수와 양수를 구분하는 방법을 생각하던 중

만든 것이 부호 비트입니다.

 

4bit를 기준으로 설명드리자면 1 0 0 0 은 -8입니다.

제일 왼쪽에 1이 있으면 음수, 0이면 양수입니다.

이러한 부호를 결정하는 비트를 사인 비트라고 합니다. 

 

10의 보수처럼, 이진법에서도 같은 적용이 필요합니다.

그래서 1의보수, 2의보수가 있습니다.

 

 

1의 보수

우선 보수 개념을 적용했는데 먼저 해본 게 1의 보수입니다.

2진법에서 1의 보수를 구할 땐 1에서 빼주면 됩니다.

결론적으로 비트 값이 뒤바뀌는 결과가 나타납니다

0 -> 1, 1 -> 0

왜냐하면.. 1에 대한 9의 보수를 구할 때 9 - 1을 한 것과 같습니다.

(1 - 0 = 1 , 1 - 1 = 0)

 

 

0 1 1 1(7)을 1의 보수로 나타내면 1 0 0 0(-7)입니다.

왜 16이 아니라 -7 이냐면 제일 왼쪽(최상위 비트)은 부호를 결정한다고 했습니다. 1로 시작하여 음수고,

보수를 샐 때는 1 1 1 1부터 거꾸로 세어 나아가야 하므로 -7이 됩니다.

 

$7 - 7 = 0$ 입니다.  0 1 1 1(7) + 1 0 0 0(-7)  = 1 1 1 1인데,

0이 0 0 0 0 이므로 1의 보수표현에 의해 0은 1 1 1 1 으로도 해석될 수 있는것이죠.

그래서 7 - 7 이 0이 되긴 합니다. 논리적으로 오류는 없는데요 1 1 1 1 이 문제라는거죠.

 

1의 보수 표현법을 쓰면

+0 ( 0 0 0 0)과 -0 ( 1 1 1 1 ) 이 생깁니다. 0에 불필요한 부호가 붙게 되는 것이죠.

 

그래서 2의 보수를 도입했습니다.

 

 

2의 보수

2의 보수는 간단합니다

1의 보수를 구한 후 +1을 해주면 됩니다.

이해가 안 되시면 같은 수에서의 10의 보수와 9의 보수의 차이를 생각해보시면 편할 겁니다.

1에 대한 10의 보수 = 9

1에 대한 9의 보수 = 8

 

결국 10의 보수를 구하기 위해선 9의 보수 + 1 을 하면 되는거죠.

이진법에서도 적용시키면 2의 보수를 구하려면 1의보수를 구하고 + 1만 해주면 됩니다.

그리고 1의 보수로 비트만 ~로 뒤집고 1만 더하는게 2에서 직접 빼는것보다도 훨씬 간편해서 사용하기도 합니다.

 

0 1 1 1(7)을 2의 보수로 나타내면 우선

1의 보수로 나타냅니다. (1 0 0 0) 그 후에 1을 더해주면 됩니다.

1 0 0 1 이 되겠죠? 그러면 7을 2의 보수로 나타냈으니

8 + (-7) = 1을 계산해서 값이 맞나 봅시다.

 

0 0 0 0 1 0 0 0

0 0 0 0 1 0 0 1

0 0 0 1 0 0 0 1

 

앞의 자리올림을 무시해주면 0 0 0 1이라는 값이 나왔습니다! 

이 값은 어떤가요? 1이죠?

SNS 공유하기
💬 댓글 개
이모티콘창 닫기
울음
안녕
감사해요
당황
피폐

이모티콘을 클릭하면 댓글창에 입력됩니다.