C언어 기초 2일차 : 자료형

bitterpotato·2020년 8월 28일
0

C언어 기초

목록 보기
2/7

자료형


자료형이란 자료의 종류를 나타내는 것을 의미한다. C언어에서는 변수의 종류를 나타내는 것이라고 생각해도 무방하다. (아래에서 설명한 크기라는 것은 표준에서의 최소 크기로 이해하도록 하자.)

자료의 종류에서는 1일차에서 언급했던 것처럼 정수형, 실수형 등의 다양한 자료형이 존재한다.


1. 정수형


정수형은 크게 정수 자체를 표현하는 int, 그리고 문자와 정수를 나타내는 char 자료형이 있다.

이들 자료형은 앞에 부호 키워드(signed, unsigned)와 크기(short, long)을 붙여 특성을 정의할 수 있다.

short와 long의 경우에는 int 생략 또한 가능해 별개의 정수 자료형으로 취급하여 서술하기도 한다.


1) char


char 자료형은 1byte이며 아스키코드를 저장한다. 내부적으로는 아스키코드를 정수의 형태로 저장해 정수형으로 분류한다.

아스키코드 표는 아래와 같다.


2) wchar_t


wchar_t 자료형은 2byte이며 유니코드를 저장한다.


3) int


정수의 영어 단어인 integer에서 따온 단어이다.

C 표준에서는 크기가 정해져 있지 않지만 현대 기기에서는 주로 4byte로 쓰인다. (최소 2byte)

+) C언어 표준에서 int 자료형의 크기가 정해지지 않는 이유


이는 C언어의 특성과 관련이 깊은데, C언어가 다른 언어에 비해 CPU의 특성을 활용한 언어이기 때문이다.

따라서 CPU와 메모리가 달라짐에 따라 많은 것들이 변화하는데, CPU의 워드 크기(CPU가 몇 bit CPU인지 의미한다)가 그 중 하나이다.

32bit 컴퓨터와의 호환성을 위해 주로 4byte로 사용된다. (절대적이지 않다)


4) short (int)


short와 short int는 같은 크기, 같은 특성을 가지는 자료형이다.

2byte 정수 자료형이다.

(-32,768)부터 (+32,767) 까지의 정수를 표현할 수 있다.


5) long


long과 long int는 같은 크기, 같은 특성을 가지는 자료형이다.

4byte 정수 자료형이다.

(-2,147,483,648)부터 (+2,147,483,647)까지의 정수를 표현할 수 있다.


6) long long


long long int와 long long은 같은 특성을 가지는 자료형이다.

8byte 정수 자료형이다.

(-9,223,372,036,854,775,808)부터 (+9,223,372,036,854,775,807)까지의 정수를 표현할 수 있다.

일반적으로 자주 사용되는 자료형은 아니지만, 백준(Baekjoon)과 같은 프로그래밍 문제를 풀 때 간간히 이용되는 자료형이다.


7) signed


signed의 경우 해당 자료형이 부호가 있다는 것을 의미하는 인자이다.

우리가 자료형을 선택할 때 기본적으로 signed가 적용된다.

예) signed int와 int는 동일하다 (signed는 생략 가능)

따라서 signed가 적용된 정수형은 -2^(bit 개수 -1) 부터 2^(bit 개수 -1)-1 까지의 값을 표현할 수 있다.


8) unsigned


unsigned의 경우 해당 자료형이 부호가 없다는 것을 의미하는 인자로서 더 많은 범위의 양수를 표현할 수 있다는 것이 특징이다.

signed short (int)의 경우 (-32,768)부터 (+32,767) 까지의 정수를 표현할 수 있다.
하지만 unsigned short (int)의 경우 0부터 65535까지의 정수를 표현할 수 있다.
즉, 표현할 수 있는 양수의 범위가 약 2배 늘어났다.


덧. 정수 자료형의 저장 방식


컴퓨터는 0(신호가 흐르지 않음)과 1만 저장한다는 것은 상식으로 알고 있을 것이다.

그러면 컴퓨터는 필수 불가결적으로 2진법으로 저장해야 할 텐데, 어떻게 저장할까?

short int 자료형의 저장 방식을 알아보겠다.

short int 자료형은 2byte 자료형인데. 따라서 16개의 bit를 사용할 수 있다.

이들 bit는 각 bit당 0과 1 (위에서 0과 1로만 저장한다는 상식과 같다)만 저장 가능하다.

따라서 16개의 bit 중 1개의 bit는 부호를 저장하고, 나머지 15개의 bit는 수를 저장하는데 사용된다는 것이다. (2진수 형태로)

아래와 같이 저장된다고 볼 수 있다.

더 정확한 이해를 위해 예로 들어 8을 short int 자료형에 저장할 경우 아래와 같다.

unsigned의 경우에는 부호 bit가 필요 없기 때문에 약 2배 큰 숫자를 저장할 수 있는 것이다.


2. 실수형


실수형은 소수점을 표현할 수 있는 실수에 관한 자료형을 의미하며 float와 double 등이 있다.

소수 표기의 한계로 인해 부동 소수점 문제가 발생한다.


1) float


단정도 4byte 실수 자료형으로서 ±3.4×10^-37부터 ±3.4×10^37까지의 실수를 표현할 수 있다. (복부호 동순)

유효숫자는 7자리이다.


2) double


배정도 8byte 실수 자료형으로서 ±1.7×10^(-308)부터 ±1.7×10^(308)까지 표현이 가능하다. (복부호 동순)

유효숫자는 15자리이다.


덧. 실수형 자료의 표현 방식 (ft. 부동 소수점)


정수는 위에서 이야기 한 것과 같이 나타낼 수 있지만, 실수는 어떻게 나타낼 수 있을까?

float의 경우에는 1개의 부호 bit와 8개의 지수 bit, 그리고 23개의 가수 bit(숫자를 표현한다고 생각하면 된다)로 이루어져 있다. 이를 단정도 방식이라고 부른다.

이보다 2배 더 큰 자료형인 double 자료형의 경우에는 1개의 부호 bit, 11개의 지수 bit, 그리고 52개의 가수 bit(위에서 말한 바와 같이 숫자를 표현한다고 생각하면 된다)로 이루어져 있다. 이는 bit 수를 두 배 확장했다고 해서 배정도 방식이라고 이야기 한다.

단정도 표현 방식은 아래와 같다.

단정도와 배정도 표현 방식은 각 bit의 개수와 다른 부분이 크게 없기 때문에 이 곳에서는 단정도 방식을 주로 설명하겠다.


부호 bit


위의 그림과 같이 가장 왼쪽의 bit, MSB라는 이 bit를 보고 판단하면 된다.

정수형과 동일하게 0일때 양수, 1일때 음수이다.

15.625를 표현 할 때, 15.625는 양수이므로 당연히 부호 bit 부분은 0이다.

지수 bit


단정도 방식에서 지수는 8비트로 표현된다.

지수 bit에 아래와 같이 저장되었을 때, 지수는 얼마일까?

정답은 25이다. 지수는 2^e 처럼 e로 표현되는데, 이때 여기서 바이어스 지수(biased exponent)라는 스킬이 들어간다.

실수끼리 연산 할 때 크기가 더 작은 실수의 가수와 지수를 조정해야 하는데, 이 문제를 해결하기 위해 실제 지수 값에 127을 더해 모두 양수로 만든다. 따라서 2^25를 표현하기 위해서는 위의 그림이 아니라 실제로는 아래 그림과 같이 저장된다.

참고


바이어스 지수의 값은 2^(지수 bit의 수 -1)로 고정된다.


가수 bit


가수는 실질적인 데이터를 의미한다. 가수만이 의미 있는 수를 담당하는데, 이때 정규화(normalized mantissa)라는 스킬이 들어간다.

정규화의 방법은 아래와 같다.

  1. 해당 숫자를 이진수로 표현한다.
  2. 이 이진수로 표현한 숫자를 1.bbbb....bb형식으로 표현할 수 있도록 지수를 조정한다.
  3. 가수를 표현할 때 bbb.....b만 표현한다. (1은 항상 존재해 저장할 필요가 없음)
  4. 단, 숫자 0을 표현하려고 할 때에는 가수를 모두 0으로 채운다.

15.625를 단정도 방식으로 표현하는 방법


15.625를 단정도 방식, 즉 float에서 실제로 어떻게 저장되는지 알아보기 위해서는 일단 15.625를 이진수로 바꾸어야 한다.

이진수로 바꾸면 1111.101이 되고, 가수 bit의 정규화 방법을 따라서 수행하면 1111.101은 아래와 같이 바꿀 수 있다.

1.111101 × 10^(11) (모두 이진수로 나타냈음에 유의하자)

따라서 가수 bit에 저장할 부분은 1111_0100_0000_0000_0000_000이고 지수 부분에는 1000_0010을 이진수로 바꾼 값이 저장된다. (편의상 네 자리씩 끊어서 작성함)

그 결과는 아래 사진과 같다.


3. 문자열


char의 배열 형태로 저장한다. (나중에 다룰 예정)


덧. 진수 표기


일반적으로 인간은 10진법, 컴퓨터는 주로 2진법을 사용한다.

그 사이에 8진법과 16진법이 존재하는데 16진법의 경우 컴퓨터와 사람 간에 많이 사용되기도 한다. (2진법과의 변환이 쉽고 2진법의 경우 4자리씩 끊어서 그 값을 16진법으로 바꾸면 바로 16진법으로 변환한 수가 되어 용이하다)

각 진법마다 표기 방식이 있는데 이는 실제 숫자를 바꾸어 보면서 알아보겠다.

10진법 : 65

16진법 : 0x41 (여기서 0x는 16진법이라는 것을 나타내는 접두사이다. x는 16을 뜻하는 hex의 줄임말)

8진법 : 0o101 (여기서 0o는 8진법이라는 것을 나타내는 접두사이다. o는 8을 뜻하는 octa의 줄임말)

2진법 : 0b01000001 (여기서 0b는 2진법이라는 것을 나타내는 접두사이다. b는 2를 뜻하는 binary의 줄임말)

앞으로 이러한 체계에 익숙해 지기 위해서 알아 놓는게 좋다.


참고


  1. 자료형이란? . (2017). https://edu.goorm.io/learn/lecture/201/한-눈에-끝내는-c언어-기초/lesson/5973/자료형이란.
  2. 단정도(single precision), 배정도(double precision)이란?. (2017). https://whatisthenext.tistory.com/146.

Special Thanks


LJLee37 (Github : https://github.com/LJLee37, Twitch : https://www.twitch.tv/ljlee37)

profile
개발자 망생이

0개의 댓글