티스토리 뷰
이전 글
2020/12/20 - [코딩 공부] - C언어 기초 : 서식 문자(제어 문자)
네 수학시간에 배웠었던 그 진법입니다.
2진수, 8진수, 10진수 등등...
아마 기억력이 좋으신 분들은 2진수를 10진수로 바꾸고 10진수를 2진수로 바꿔 표현하는 계산을 배웠던 것이 기억나실 것입니다.
전 오랜만에 보니 기억이 나기는 커녕 수포자였기 때문에 아주 새로웠습니다.
근데 이런 저도 이걸 했잖아요?
그러니 여러분도 하실 수 있어요.
어쨌든 컴퓨터의 세상은 우리처럼 10진수가 아닌 2진수로 이루어져 있기 때문에 컴퓨터의 세상을 좀 더 이해해보기 위해 진법이 무엇인지 알아보겠습니다.
1. 진법이란 무엇일까?
수를 표기하는 방법
진법 | 표현범위 | 표현 식 | 사용 예 |
2진수 | 0, 1 | 없음 | 1100 |
10진수 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 | 없음 | 2021 |
8진수 | 0, 1, 2, 3, 4, 5, 6, 7 | 0 | 012 |
16진수 | 0 ~ 9, A ~ F | 0x | 0xA |
진법엔 이런 것들이 있는데 2진수를 사용하는 컴퓨터와 10진수를 사용하는 사람 간에 의사소통을 하기 위해서 컴퓨터가 쓴 2진수를 10진수로 바꿔서 사람에게 보여주고 사람이 쓴 10진수를 2진수로 바꿔서 컴퓨터에게 보여주는 작업을 하게 됩니다.
물론 우리가 하는 것은 아니고 컴퓨터가 다 합니다.
그런데 공부하는 이유는 2진수와 16진수 등등에 대한 개념을 알고 있으면 컴퓨터가 작업하는 방식에 대한 이해가 쉬워지거든요... 컴퓨터가 작업하는 방식을 알고 있으면 나중에 코드를 작성할 때도 왜 이렇게 써야 할까 하는 물음표를 조금이나마 줄이실 수 있을거에요.
2. 2진수 -> 10진수 바꾸기
우리가 사용하는 10진수는 0 ~ 9까지의 숫자를 조합해서 원하는 숫자를 표현하는 것입니다.
10진수라 하면 보통 1 ~ 10까지의 수를 떠올리게 되는데 모든 숫자는 0부터 시작합니다.
사실 10도 1과 0을 조합한 것이지요.
그래서 0부터 9까지의 숫자 10개를 사용하기 때문에 10진수라고 부릅니다.
그러면 2진수는 0과 1 두개만 사용하기 때문에 2진수이지요.
컴퓨터도 우리처럼 10진수를 사용하면 서로 편할텐데 굳이 2진수를 쓰는 이유는 컴퓨터 머리는 사람 같지가 않아서 전기가 들어온 것과 안 들어온 것으로 모든 것을 판단하기 때문입니다.
전기가 들어와서 켜졌을 땐 1
꺼졌을 땐 0
어휴 제가 쓰고 봐도 컴퓨터가 생각보다 멍청하네 싶지만 좀 더 똑똑한 우리가 이해해 줍시다;;
그럼 10진수를 2진수로 바꾸려면 어떻게 해야 할까요?
10을 2진수로 바꾼다면 먼저 10을 2로 나눠줍니다.
위 그림처럼 몫이 1이 될 때까지 나눠주면서 중간에 생기는 나머지 값들도 기록해 둡니다.
10을 2로 나누면 몫은 5이고 나머지는 0이죠.
그 다음 5를 2로 나누면 몫은 2이고 나머지는 1입니다.
마지막으로 2를 2로 나눠주면 몫은 1이 되고 나머지는 0입니다.
그러면 그림처럼 마지막 몫 1부터 시작해서 화살표 순서대로 적으면 2진수로 표현한 10이 됩니다.
10을 2진수로 표현하면 1010인 것입니다.
그럼 저게 정말 맞는 계산인지 확인을 해 보아야겠죠?
위 그림처럼 2진수 각 자리에 앞에서부터 2의 0제곱, 2의 1제곱, 2의 2제곱, 2의 3제곱 ~ ... 을 곱한 수를 구한 다음 그 중 1인 자리의 숫자만 더해주면 됩니다.
그럼 10이 나왔네요. 짝짝짝!
만약 더 큰 숫자라서 1110111 이런식으로 길어진다면 2의 0제곱, 2의 1제곱, 2의 2제곱, 2의 3제곱, 2의 4제곱, 2의 5제곱... 이런 식으로 제곱수를 계속 늘려가면서 계산한 후 나온 숫자들을 더해주면 됩니다.
3. 2진수 -> 16진수 바꾸기
2진수의 4자리는 16진수의 한 자리로 표현이 가능합니다.
10진수 | 2진수 | 16진수 | 10진수 | 2진수 | 16진수 |
0 | 0000 | 0x0 | 8 | 1000 | 0x8 |
1 | 0001 | 0x1 | 9 | 1001 | 0x9 |
2 | 0010 | 0x2 | 10 | 1010 | 0xA |
3 | 0011 | 0x3 | 11 | 1011 | 0xB |
4 | 0100 | 0x4 | 12 | 1100 | 0xC |
5 | 0101 | 0x5 | 13 | 1101 | 0xD |
6 | 0110 | 0x6 | 14 | 1110 | 0xE |
7 | 0111 | 0x7 | 15 | 1111 | 0xF |
위와 같은 변환표가 있는데 외우실 필요는 없습니다.
쉽게 계산하시려면 아까 2진수를 10진수로 바꿀 때 계산했던 것처럼 2진수들을 10진수로 바꾸는 계산을 한 다음 10이 넘어가는 숫자엔 A, B, ... 알파벳을 붙이면 16진수가 됩니다.
* 그런데 여기서 16진수 앞에 0x를 붙여서 표현하는 이유가 궁금하실 수 있어요.
그 이유는 16진수로 표현한 1~9가 10진수의 1~9와 같잖아요?
그래서 그냥 1 만 있으면 이게 10진수의 1인지 16진수의 1인지 알 수가 없어요.
그래서 이 1은 16진수의 1이다 라고 구분을 해주기 위해서 16진수를 표현할 땐 앞에 0x를 붙입니다.
그래서 1이라 쓰면 10진수로 표현한 1,
0x1 이라 쓰면 16진수로 표현한 1이구나! 라고 알 수 있는거죠.
이것도 배우는 이유는 컴퓨터의 메모리 주소 또한 2진수로 표현이 되는데 전부 1100 0010 1010 ... 이런식으로 보면 너무 길고 알아보기도 힘들잖아요.
그래서 이걸 조금 줄여서 16진수로 표현할 수 있습니다.
예를 들어 32비트 메모리의 주소가 위와 같다면 그 중 2진수 숫자 하나는 1비트
숫자 8개 묶음은 1바이트
8개 묶음이 4개 모이면 4바이트의 크기를 가지고 있습니다.
크기 단위가 2의 배수로 늘어나네요.
2진수 4자리를 16진수의 숫자 하나로 표현할 수 있다보니 2진수에서 16진수로 변환하는 것은 알고 계시면 도움이 됩니다.
근데 이걸 모른다고 당장 프로그래밍 하는데에 엄청나게 지장이 있는 것은 아니라서 그냥 이런것이 있구나 정도로만 알고 계셔도 됩니다.
그냥 그렇구나 정도로 알고 계셨다가 나중에 뒷부분을 더 공부하고 궁금해지면 그 때 알아보셔도 괜찮다고 생각합니다.
그리고 각 자리들을 16진수로 표현하면 저렇게 됩니다.
메모리의 주소를 16진수로 표현하면 0xDB9C5716이 되네요.
아주 조금 주소같아지고 좀 더 간결해졌습니다.
0과 1만 늘어놓은 숫자보다는 좀 더 읽기 편하죠? (아니면 어쩔 수 없구요...ㅎ)
진법 부분은 여기가 지나가면 볼 일이 별로 없으니 가볍게 넘어가시고 다음 포스트에서는 변수에 대해 알아보겠습니다.
이제 수학 공부는 그만 하고 프로그래밍 하는 것 같은 코드를 쓸 거에요!
그럼 다음 포스트에서 만나요~
'코딩 공부 > C 언어' 카테고리의 다른 글
C언어 기초 : 자료형 (0) | 2021.01.24 |
---|---|
C언어 기초 : 변수 (0) | 2021.01.24 |
C언어 기초 : 서식 문자(제어 문자) (0) | 2020.12.20 |
C언어 기초 : Escape 문자 (0) | 2020.12.20 |
C언어 기초 : C언어 프로그래밍 시작하기 (2) | 2020.12.19 |
- Total
- Today
- Yesterday
- 깊이우선탐색
- c언어
- 하드웨어
- dp
- C언어기초
- 캐나다
- 애플
- 해커랭크
- 아이패드
- 캐나다생활
- 백준
- 영어공부
- c++
- 프로그래머스
- greedy
- 컴퓨터공부
- 컴퓨터사이언스
- 기초
- 코딩공부
- 프로그래밍
- 다이나믹프로그래밍
- 너비우선탐색
- BFS
- 알고리즘
- DFS
- 컴퓨터
- hackerrank
- 그리디
- 스위프트플레이그라운드
- 문제풀이
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |