[C 언어의 기초] 데이터형과 선언 - 1부









변수와 정수



프로그램의 실행 중에 그 값을 변경할 수 있는 것을 변수(variable), 값을 바꿀 수없는 것을 상수(constant)라고 한다. 상수의 예로는 123, 12.34, 3.14159, 'A', "string" 등이 있다. 

일반적으로 변수는 값을 보존해 두는 상자와 같은 것이라고 생각할 수 있는데 그 상자를 구별하기 위해서 붙인 이름이 변수 이름으로, 값을 저장하고 있는 기억장소의 이름이다. 

변수(또는 함수)의 이름은 a-z, A-Z, _, 0-9를 사용하고 첫 문자는 영문자 또는 _으로 시작한다. 단, 앞 절에서 예시한 것처럼C 언어에서 사용되는 예약어는 변수의 이름으로 허용되지 않는다. 예를 들면, a = 10; 이라는 대입문에서 a가 변수, 10이 상수이다.



데이터 형



데이터를 나타내는 데는 형(type)이라는 개념이 있다. 예를 들면 10과 같이 소수점을 포함하지 않는 것을 정수형, 10.0과같이 소수점을 포함하는 것을 실수 형이라 한다.

C 언어에는 문자형(char, unsigned char), 정수형(short, unsigned short, int, unsigned int, long, unsigned long), 실수 형(float, double), enum형, 배열 형, 포인터 형, 구조체, 공용체, void형 등의 데이터 형이 있다.



기본 데이터형의 크기와 범위



문자형은 문자 하나를 저장하는 1 바이트의 크기로 구성되어 있고, -128∼127과 0∼255 사이의 값을 가진다. 정수형은 short 정수, int 정수, long 정수와 각각의 부호 없는 정수 등이 있다. short 정수는 2바이트, long 정수는 4 바이트, int 정수는 컴퓨터 혹은 컴파일러에 따라 2 바이트 혹은 4 바이트로 다르다. 

Turbo C 에서는 int는 2 바이트이다. Visual C++에서는 4바이트이다. 실수 형은 float, double 이 있다. 다음에 Turbo C의 기본 데이터 형과 확장 데이터형의 크기와 범위를 정리했다. 일반적으로 데이터 크기가 작으면 적은 메모리 용량을 차지하지만 표현되는 범위도 작아진다. 반대로 데이터 크기가 크면 큰 용량의 메모리가 필요하며 표현되는 범위는 넓어진다.

1. 기본 자료형
1) char : 한 문자를 저장하는 기억장소(1 byte) 이름
           -128 ∼ +127 또는 0 ∼ 255 (unsigned)

2) int : 정수 하나를 저장하는 기억장소(2 or 4 bytes) 이름
   signed인 경우 : -215∼ +215-1 또는 –231∼ +231-1
   unsigned인 경우 : 0 ∼ 216-1 또는 0 ∼ +232-1

3) float : 실수 하나를 저장하는 기억장소(4bytes) 이름
   double인 경우는 2배 : 10-64∼ 10+63,유효숫자는 최대 8자리

2. 확장 자료형
1) short, long : int 앞에 덧붙일 수 있는 qualifier
2) signed, unsigned : int 또는 char 앞에 덧붙일 수 있는 qualifier
3) double : float 앞에 덧 불일 수 있는 qualifier

(예) short (int), long (int), signed(int), unsigned (int), signed short (int)
     unsigned short (int), signed long (int), unsigned long (int), double (float)


#include <stdio.h>

main()
{
   int i;
   i=32767;
   /* Visual C++에서는 2147483647로 바꿔 볼 것*/
   printf("%d, %d, %d\n", i, i+1, i+2);
   }


위의 예제 프로그램 3을 각자 실행시켜 보자. 어떤 결과가 나오는가? 앞에서 설명한대로 int가 표현할 수있는 가장 큰 수는 정수가 2바이트로 표현되는 경우 +215-1로 32767이다.

따라서 이 수에 1과 2를 각각 더하면 그 범위를 넘어서게 되므로 결과는 32768과 32769가 아닌 오버 플로우 에러가 유발되는 것이다. 그러면 정수가 4바이트로 표현되는 경우에는 위의 프로그램은 어떻게 될지 각자 생각해 보자.


예제 실수의 반올림 오차
#include <stdio.h>

main()
{
  float x, y;
  x = 2.0e20 + 1.0;
  y = x - 2.0e20;
  printf("%f, %f\n", x, y);
  }


위의 예제 프로그램을 실행시켜 보자. 손으로 계산한 결과와 다른 값이 나온다. 그 이유를 생각해 보자.




Reactions

댓글 쓰기

0 댓글