인간은 10진수를 쓰는 이유?
원시시절부터 손가락은 10개여서 수를 10개까지만 샘
10진수는 0부터 9까지 숫자로 유용한 범위를 표현 가능해왔다.
근데 컴퓨터는 기계어 이진수를 쓴다.전자 회로가 켜지냐 안켜지냐가 곧 경우의 수가 2개이기 때문에 컴퓨터는 손가락 2개 가지고 데이터를 처리하는 것이다.
이 시점에서 우선적으로 알아야 될 개념
-0과1의 데이터 이걸 비트라고 한다.
1bit는 2개만 저장해...2bit는 4개만 저장해...3bit는 8개만 저장해...
이렇게 비트는 데이터 갯수를 얼만큼 저장할 수 있는 메모리 창고인 것임.
더 자세히 표현하자면
비트가 1개 있을때는 2의1승. 2^1 = 2가지 상태를 나타낼 수 있는 1자리수
비트가 2개 있을때는 2의2승. 2^2 = 4가지 상태를 나타낼 수 있는 2자리수
비트가 3개 있을때는 2의3승. 2^3 = 8가지 상태를 나타낼 수 있는 3자리수
비트가 4개 있을때는 2의4승. 2^4 = 16가지 상태를 나타낼 수 있는 4자리수
= ㅁ진수 단위숫자 하나가지고 0부터 ㅁ-1까지 총 ㅁ-1가지를 표현할 수 있으니깐 이걸 표현하는데 필요한 이진수 단위숫자는 지수개(ㅁ을 2의제곱근으로 나타냈을때의 지수)가 필요하다는 이야기
2비트는 4가지를 표현할 수 있고, 0부터 3까지의 데이터를 표현한다.
8비트는 256가지를 표현할 수 있고, 0부터 255까지의 데이터를 표현한다.
-> 이땐 컴퓨터 공학에서 8비트를 묶어 데이터가 저장되는 최소단위로 활용하기로함
이때 최소단위가 되는 8비트는 또 2개 단위로 나눌 수 있다.
앞비트4개, 뒷비트4개 이렇게 나눠지는데 이때 이 4개의 단위를 NIDDLE(니들)이란 용어로 표기한다.(16진수는 니블 단위로 표현한다)
8bit=2niddle
2niddle=1byte
1niddle=4bit(4비트는 0~15까지 데이터 저장이 가능)
다시 돌아와서 근데 16진수란것은 왜 언급되는가?
잘쓰고 있는 10진수 놔두고 굳이 16진수 쓰는 이유?
이진수로 길게 표현할 경우 -> 우리가 보기엔 어렵다 01010101111001001
십진수로 길게 표현할 경우 -> 연속적인 숫자가 나왔을 때,데이터를 구분하는게 힘들다
(어디까지가 1byte의 데이터지...?) 구분할 방법이 없음.
10진수 체계에선 10부터 15까지의 숫자를 한자리로 표현할 수 없음
그래서 10부터15를 한자리로 표현할 수 있는 방법이 없을까 고민해서 고안해낸게 16진수이다.알파벳으로 숫자를 표현하면 한자리 표현이 가능한 것이다.
16진수로 길게 표현할 경우 -> A0F1E3129A8CDF148
여기서 데이터를 구분할 수 있는데, 16진수는 2^4이여서 16가지의 경우의 수가 있다.(0~15) 근데 16진수를 기계어로 표기할 땐 8자리의 비트로 이진수를 표기한다.(비트엔 0과1만 들어가니깐) 그리고 이때 앞비트 4개 뒷비트 4개 즉 2개의 니들 단위로 표기한다.
이렇게 16진수로 길게 표현을 하면 니들 두가지를 묶으면 한바이트가 되는것이다.데이터의 경계선이 명확하게 구분이 되는 것!
예로 들어 16진수는 표기할 때, OxA4 이렇게 표기하는데 A4 E1이렇게 표현하면 1바이트를 표현할 수 있는 것!
이제부터 중요한 부분인데,진수의 개념을 짚고가겠다.여기서 진수는 '한자리에 쓸 수 있는 범위'다.여기서 내가 착각한게 있었는데 단순히 한자리에 들어갈 수 있는 숫자들의 범위라기 보다는 여기서 말하는 '한자리'는 8진수든 16진수든,그 코드의 숫자 하나를 말하는 것이고, '쓸 수 있는 범위'란 부분에서 추가적으로 정립해야될 개념이 상대적 기준을 이진수로 생각해야된다라는 것이다.
예로 들어 ㅁ진수의 숫자 코드가 있는데
ㅁ을 2의제곱근으로 표현했을 때(컴퓨터는 2진수를 쓰니깐 그걸 기준),이때 숫자코드의 밑수 하나가 이진수로 바꿨을때의 숫자코드중 끊어지는 단위 코드 니들 하나와 같다는 것임.이 끊어지는 단위의 기준이 곧 지수인 것이다.
16진수면 2^4이니깐 이진수 4자리 단위코드 즉 니들 하나가 16진수 숫자코드의 밑수 하나를 의미하는 것임.
결론 : 컴퓨터 공학에선 1바이트랑 구분이 되는 16진수로 쓴다.
그 외
내가 C언어에 데이터를 요청할 땐,
1byte를 요청하면 char 자료형 쓰는거고
2byte를 요청하면 short 자료형 쓰는거고
4byte를 요청하면 int 자료형 쓰는거고
8byte를 요청하면 long long 자료형 쓰는 것
바이트 단위
1byte(1바이트)
1000byte(1000바이트) = 1kbyte(일키로바이트)
1000kbyte(1000키로바이트) = 1mbyte(일메가바이트)
1000mbyte(1000메가바이트) = 1Gbyte(일기가바이트)
1000Gbyte(1000기가바이트) = 1Tbyte(일테라바이트)
진법 계산(= 어떤 양을 표현할 때 몇자리로 표현하는가)
단위숫자(=digit) = 한 자리에 들어가는 숫자
10진법
=어떤 양을 표현할 때 10개로 수를 표현한다. = 0~9를 가지고 수를 표현한다.
2진법
=어떤 양을 표현할 때 2개로 수를 표현한다. = 0과1로만 수를 표현한다.
8진법
=어떤 양을 표현할 때 8개로 수를 표현한다. = 0~7를 가지고 수를 표현한다.
16진법
=어떤 양을 표현할 때 16개로 수를 표현한다. = 0~9, A~F를 가지고 수를 표현한다.
우리가 쓰는 10진수의 숫자는 오른쪽 일의자리에서 왼쪽으로 가면서 '가중치'라는게 적용된다.이게 뭔 말이냐면, 숫자의 각 밑수(숫자의 요소 하나하나)에 10에 지수를 적용한것을 곱한것끼리 더하면 같은 십진수의 숫자가 나오는데 이때 10의 지수를 적용한 것들을 가중치라고 한다.10진수만 아니라 모든 진법은 이렇게 표시가 가능함
ex) 1024는 (10^3 1) + (10^2 0) + (10^1 2) + (10^0 4)과 같다.
이때 10^3,10^2,10^1,10^0이 가중치임
8진법이든, 2진법이든, 16진법이든 10진법으로 나타내고 싶을땐 앞과 같은 방법을 쓰면된다!!!!
그렇다면 그 반대의 경우는 어떻게 해야되나? 내가 10진수를 16진수로 나타내고싶어
보통은 그 수에 나누기 2나 8, 16으로 나눈 후 각 진법 수로 몫이 0이 될때까지 나누고 나머지로 표기를 하면 된다!!!!
근데 2진법,8진법은 나누는게 비교적 간단하지만 16진법부턴 좀 부담스럽다, 그래서
16진법을 빠르게 구하기위한 방법이 있는데
1.바로 암산하기 쉬운 8진법으로 나타내고
2.그 나온 값으로 다시 2진수로 변환해주자
(이때 8진법으로 바꾼 숫자의 단위숫자(밑수) 하나하나가 이진수에선 3코드자리에 해당함)
3.그리고 여기서 16진법같은 경우는 바로 4코드자리가 한 단위숫자에 해당하는것이기에
이진수를 4단위로 끊자(=니들 단위 구분)
4.그럼 그 이진수 코드를 16진수로 변경