자료형과 해석

2022. 2. 24. 22:25IoT Embeded 강의

C언어에서는 변수를 쓰기 전에 이 변수에 대해 어떤 자료형을 갖고 있고 어떤 변수이름(식별자)으로 사용할지 미리 컴파일러에게 인지를 시켜줘야 합니다. 소스코드 상에서 아래와 같이 사용하며 변수를 선언한다고 얘기합니다. 선언은 일반 변수뿐만 아니라 포인터, 배열, 함수등 여러 종류의 선언이 있습니다. 

 

int x; //  'x'라는 변수 이름을 지어주면서 이 변수의 자료형은 int형이라는 의미입니다. 

char Array[5]; 'Array'라는 배열 이름을 지어주면서 이 배열의 자료형은 char로 char형 변수가 5개 있는 것과 같습니다. 

 

여기서 자료형이라는 것에 대해서 정리하겠습니다. 컴퓨터는 모든 데이터와 명령어들을 최종적으로 0과 1로 표현합니다. 이진법에서 자리가 한칸이라면 그 한칸의 자리에서 표현 가능한 방법은 그 자리에 0을 쓰거나 1을 쓰는 것 두 가지가 전부입니다. 만약 자리가 두칸이라면 각 자리에서 가능한 경우의 수끼리 곱해주면 됩니다. 결론적으로 n개의 자리가 있다면 총 2의 n제곱한 만큼 경우의 수가 나타납니다. 이를 십진법 수와 1대1 대응시키거나 문자를 대응시키는 등 여러 가지 방법으로 데이터를 표현할 수 있습니다. 

 

자리가 1개인 경우 : [0] , [1]

자리가 2개인 경우 : [0][0], [0][1], [1][0], [1][1]

 

여기서 자리가 컴퓨터에서 bit입니다. 2bit로는 표현할 수 있는 데이터는 4개입니다. byte 는 bit를 8개 묶어 놓은 단위입니다. 그렇다면 1byte는 8bit이므로 2의8승, 즉 256개의 데이터를 표현할 수 있습니다. 십진법의 수와 1대1 대응시킨다면 0부터 255까지 총 256개의 수를 표현할 수 있습니다. 

 

char 자료형은 1byte이며 문자 데이터를 표현할 때 주로 사용하고 int자료형은 4byte이고 정수를 표현할 때 사용하는 자료형입니다. char형 자료형으로 선언된 변수 4개가 있다면 그 크기는 int형하고 같을텐데 왜 굳이 int형을 만들어서 사용할까요? 이는 컴퓨터가 자료형에 따라 이들을 해석하는 방법이 다르기 때문입니다. 

 

예를 들어보겠습니다. 어떤 데이터가 크기가 4byte로 어떤 변수에 담겨메모리 공간을 차지하고 있다고 가정해보겠습니다. 이를 이진법으로 나타내면 '01101010011011010101001100110101'라는 긴 이진수가 나옵니다.(자리 한개의 1bit이고 총 32bit의 수이므로 이는 4byte입니다.) 만약 이 데이터가 담겨 있는 변수가 int형이라면 이 긴 숫자를 통째로 담고 있으므로 해석도 한번에 이진수를 십진수로 전환할 것입니다. 이를 십진수로 바꾸면 '13949606'이 됩니다. 

 

그렇다면 이 긴 숫자가 사실 char형 변수 4개가 연속해서 있는 것이라면 어떨까요? 총 32개의 긴 이진수를 8개씩 끊어서 해석할 것입니다. 그러면 01101010 / 01101101/ 01010011/ 00110101 총 4개의 이진수로 나눠서 각각 십진수로 전환할 것입니다. 결과는 106 / 109 / 83 / 53 입니다. 이와 같이 해석하는 크기 단위를 다르게 하면 전혀 다른 결과가 나오게 됩니다. 위의 예시는 단순히 char형과 int형이 해석하는 방식이 다르다는 것을 보여주기 위해서 든 예시입니다. 

 

위와 같이 자료형이란 메모리에 저장된 0과 1의 데이터를 해석하는 방식을 말하며 자료형의 크기는 해석하는 범위의 크기를 말한다고 할 수 있습니다. 위의 십진수 결과에서 char형은 최대 255까지 수를 표현할 수 있으므로 그 이상의 수는 나올 수 없습니다. 따라서 char형 변수 4개와 int형 변수 1개는 메모리 크기가 같다고 해서 같은 것이 아닙니다. 0과 1밖에 모르는 컴퓨터 메모리 위의 기나긴 이진수를 어떤 방식으로 해석하느냐에 따라 다양한 데이터를 표현할 수 있는 것입니다.

 

 

'IoT Embeded 강의' 카테고리의 다른 글

동적 메모리 할당  (0) 2022.02.28
포인터 / 포인터 선언 / 초기화 / 연산 / 문자열  (0) 2022.02.28
배열과 문자열  (0) 2022.02.14
1차원 배열  (0) 2022.02.14
증감 연산자  (0) 2022.02.10