[ C 언어 스터디 ]

 

자료출처: 핵심 길잡이 C 프로그래밍 언어

도서출판: 성안당

 

2. 기본 자료형 ( Data Type )

자료 ( date )라 함은 프로그램 상에서 실제 적용되는 값으로 자료형 ( data type ) 의 종
류인 상수와 변수들에 사용되는 기본적인 값들을 의미한다. 상수 ( constant )는 변하지
않는 일정한 값을 가지나, 변수 ( variable )는 기억된 값이 변할 수도 있다. 이들은 모두
메모리의 특정한 주소에 위치한 일련의 바이트 ( byte )들로 구성되며 그 형태는 데이터
의 형에 따라 달라진다.
C 언어에서 사용되는 데이터의 형에는 여러 가지가 있다. 기본적인 데이터의 형은
정수형, 부동 소수점형, 문자형으로 나눌 수 있다. [ 표 2-1 ]은 C 언어에서 사용되는 기
본적인 데이터형을 나타낸 것이다.
프로그램에서 사용할 수 있는 상수들의 형태는 데이터의 형에 따라서 미리 정해져
있다. 그러나 변수들은 사용하기 전에 반드시 데이터의 형을 선언하여야 하며, 초기값
을 부여할 수도 있다.

[ 표 2 -1 ] 데이터형, 크기, 허용 범위

데이터형

 데이터 크기 ( bits )

값의 허용 범위

16비트 컴퓨터 32비트 컴퓨터

short

16 16 -32,768 ~ 32,767

int

16 32 -32,768 ~ 32,767

long

32 32 -2,147,483,648 ~ 2,147,483,647

unsigned int

16 16 0 ~ 65,535

unsigned long

32

32

0 ~ 4,294,967,295

float

32

32

double

64

64

long double

80

80

char

8

8

- 128 ~ 127

unsigned char

8

8

 0 ~ 255

 

★ 상 수 ★

상수는 프로그램 실행 중 그 값이 변하지 않는 고정된 숫자 값 ( fixed numericvalue )으로
정수형 상수 ( integer constant ), 문자열 상수 ( string constant ), 기호 상수 ( symbolic constant )
로 분류된다.

< 정수형 상수 ( Integer constant ) >

기계 내부에서 사용하는 정수형 데이터의 표현 형태는 시스템에 따라 조금씩 다를 수 있으나
[ 그림 2 - 1 ]과 같이 2진수 형태로 표현되다.

0       15
 S                              

S: 부호 비트 ( sign bit, 양수 : 0, 음수 : 1 )
값의 허용 범위 :
(  a ) 16비트로 표현되는 경우

0        31
S                                                              

S: 부호 비트 ( sign bit, 양수 : 0, 음수 : 1 )
값의 허용 범위: )
( b ) 32비트로 표현되는 경우

[ 그림 2 - 1 ] 정수형 데이터의 표현

 

정수형 상수는 소수점이 없는 상수로 10진수 ( decimal ) , 8진수 ( octal ), 16진수
( hexadecimal )로 구분된다. 10진수는 시스템이 표현할 수 있는 값의 범위 내에서
소수점이나 지수를 사용하지 않고 12, -12, 0 등과 같이 부호 ( +, - )와 숫자 ( 0 ~9 )
들로만 표현된다. 이 경우 부호 비트가 0 ( zero ), 16진수로 표시할 때에는 숫자
앞에 0x과 0X를 붙여서 나타낸다. 예를 들면 다음과 같다.

10진 정수 8진 정수 16진 정수
15 017 0xF
113 0161 0x71
2728 05250 0XAA8

그러나 100000000과 같은 큰 수는 다음과 같이 수의 끝에 L ( 또는 소문자 ㅣ )을 붙이
면 long 형의 정수형 상수로 취급된다. 예를 들면 다음과 같다.

10진 정수 8진 정수 16진 정수
50 062L 0x32L
-32 0162L 0x72L
27L 02655L 0x5ADL

 

다음 프로그램의 실행 결과는 어떻게 되겠는가? ( Turbo C에서만 실행할 것 )

▶프로그램

#include < stdio.h >

main ( )
{

printf ( " %d\n ", 65535) ;

printf ( " %Ld\n", 65535) ;

printf(" %10Ld\n",  65535) ;

}

▶실행 결과 ( 단, Visual Studio 6.0에서는 컴퓨터에 따라 결과가 다르게 나타

날 수 있다. )

-1
65535

65535

 

다음 프로그램의 실행 결과는 어떻게 되겠는가 ?

▶프로그램

#include < stdio.h >

main()
{

printf ( " %d \n", 0x31 ) ;
printf ( " %o \n", 0x31 ) ;
printf ( " %x \n", 0x31 ) ;

}

▶실행결과

49
61
31

 

< 부동 소수점 상수 ( Floating point constant )>

부동 소수점 상수는 [ 그림 2 - 2 ]에 나타낸 것과 같이 지수부와 소수점을 나뉘어져 2
진수 형태로 표현된다. 이것은 유효숫자를 나타내는 소수부와 크기를 표시하는 지수부
의 비트가 제한되어 있기 때문에 그 근사값이 기억되는 경우가 많다. 예를 들어 ⅓
은 0.3333.......과 같이 무한이 계속되나 유효숫자를 표현할 수 있는 데까지만 기억된다. 따라
서 이러한 유효숫자를 나타낼 수 있는 비트 수가 많을수록 원래 수에 가깝게 표현될 수 있다.

7 8 31
S                                                              

S: 부호 비트 ( sign bit, 양수 : 0, 음수 : 1 )
값의 허용 범위 :  
 ( a ) 32비트로 표현되는 경우

7 8 63
S                                                                                                                              

S: 부호 비트 ( sign bit, 양수 : 0, 음수 : 1 )
값의 허용 범위 :
( b ) 64비트로 표현되는 경우

[ 그림 2 - 2] 부동 소수점형 데이터의 표현

부동 소수점 상수의 자료형은 float와 double로 지정되며 부호와 지수부를 나타내는
비트 수는 같으나, 소수부를 나타내는 비트 수가 double형이 많으므로 보다 정확한 수
를 원하는 경우에는 double형을 사용하여야 한다. C 언어에서 표현 가능한 부동 소수
점형 상수에는 10진수형 ( decimal form ) 과 지수형 ( exponential form )으로 구분된다.
예를 들면 다음과 같다.

10진형 지수형
12.345 12.3e-2
-0.01234

-12.E3

123. 0.31415e+3
-.12345 .314e05

 

다음 프로그램의 실행 결과를 나타내시오

▶프로그램

#include < stdio.h >

void main ( )
{

float a, b ;
a = 12.34f ;
b = 56.78f ;

printf ( " %f + %f\n ", a , b , a + b) ;
printf ( " %f - %f\n ", a , b , a  -  b) ;
printf ( " %f * %f\n ", a , b , a * b) ;
printf ( " %f / %f\n ", a , b , a / b) ;

}

▶실행 결과

12.340000 + 56.779999 = 69.119999
12.340000 - 56.779999 = - 44.439999
12.340000 * 56.779999 = 700.665194
12.340000 / 56.779999 = 0.217330

 

< 문자 상수 ( Character constant ) >

문자 상수는 하나의 문자를 단일 인용부호 ( '    ' )로 묶어서 표현하거나, 인쇄가 불가
능한 문자들은 \ ( back slash ) 와 문자를 조합하여 만든 확장 문자열 ( escape sequence )
을 단일 인용부호로 묶어서 표현한 것이다. 이때 사용되는 문자는 8비트로 처리되며 이
는 내부적으로 ASCII ( American Standard Code Information Interchange ) 코드
와 EBCDIC ( Extended Binary Coded Decimal Interchange ) 코드에 대응하는 숫자
값으로 변환되어 기억된다.

따라서, 문자 상수는 다른 문자와 비교하는 데 많이 사용되며, 다른 숫자와 마찬가지
로 산술 계산에도 사용된다. 그러나 ASCII 문자 집합을 키보드로 모두 나타낼 수는
없다. 이러한 문제를 해결하는 것이 \ ( back slash )를 이용하여 문자 집합에 해당하는
코드 값으로 표현하는 방법이다.

다음 프로그램의 실행 결과를 나타내시오

▶프로그램

# include < stdio.h >

void main ( )
{

char a , b ;
a = 'A' + 1 ;     /*  문자 ' A '의  ASCII 코드값은 10진수 65 */
b = a + 2 ;
printf ( " %c \n " , a ) ;
printf ( " %d \n " , b ) ;

}

▶실행 결과
B
68

 

다음 프로그램의 실행 결과를 나타내시오

▶프로그램

# include < stdio.h >

void main ( void )
{

char beep ;
beep = ' \x07' ;
printf ( " %c This is a beep !!! \n " , beep ) ;

}

▶실행 결과

This is a beep !!!

역슬래시 ( ' \ ' ) 바로 다음 문자를 확장 문자열 ( escape sequence ) 이라 하며 이것은
화면상의 출력은 없고 화면 출력을 제어하는 제어 문자로 사용된다.

[ 표 2 - 2 ]는 확장 문자열을 나타낸 것이다.

[ 표 2 - 2 ] 확장 문자열

확장 문자열 명 칭 ASCII 코드 의 미
\a Alert 0x07 경고음을 낸다.
\b Backspace 0x08 인쇄 반대방향으로 1칸 이동한다.
\f Formfeed 0x0C 인쇄 용지를 한 페이지 넘긴다.
\n Newline 0x0A 줄을 바꾼다.
\r Carriage return 0x0D RETURN키를 누른 것과 같다.
\t Horizontal tab 0x09 수평으로 몇 칸을 띄운다.
\v Vertical tab 0x0B 수직으로 몇 칸을 띄운다.
\\ Backslash 0x5C 문자 \를 출력한다.
\' Single quote 0x2C 문자 ' 를 출력한다.
\" Double quote 0x22 문자 " 를 출력한다.
\? Question mark 0x3F 문자 ? 를 출력한다.

 

다음 프로그램의 실행 결과를 나타내시오

▶프로그램

# include < stdio.h >

void main ( void )
{

printf ( " %c %c %c %c " , ' A ' , ' \n ' , 67 , '\007 ' ) ;

}

▶실행 결과
A
C
(벨이 울린다. )

 

< 문자열 상수 ( String constant ) >

문자열 상수는 한 개 이상의 문자들로 이루어진 것을 이중 인용부호 ( "   " )로 묶어서
표현한다. 문자열 상수는 기계 내부에서 문자 배열 ( array )로 기억되며, 이러한 문자열
을 표시할 때 각각 한 개의 문자는 배열의 각 요소에 저장되고, 컴파일러는 문자 배열
의 끝에 널 문자 ( null character : '\0' )를 자동으로 부가하여 문자열의 끝을 알 수 있
게 한다.
문자 상수 ' P '와 문자열 상수 " P "의 기억 형태를 나타내면 다음과 같다.

P

( a ) 문자 상수 ' P '

P \0

( b ) 문자열 상수 " P "

[ 그림 2 - 3 ] 문자 상수 ' P '와 문자열 상수 " P "의 차이
또한, C 언어에서의 문자열은 다른 프로그래밍 언어와는 달리 배열과 매우 밀접한
관계를 갖고 있으며, printf 문에서 사용하는 문자열 서식은 %s 로 표현된다.

 

< 기호 상수 ( Symbolic constant ) >

기호 상수란 프로그램 상에서 # define 선언문으로 정의하는 상수를 말한다. 이 기호
상수의 사용으로 아주 편리하게 프로그램을 작성할 수 있다.
또한, 이러한 기호 상수들은 대문자, 소문자, 숫자 그리고 밑줄문자 ( _ ) 등으로 만들
수 있으며 첫 글자만 영문자로 시작하면 된다.
C 언어 상에서 모든 명령이 소문자로 이루어지는 것과는 달리 이 기호 상수들은 대
소문자의 구별이 없다.

다음 프로그램의 실행 결과를 나타내시오

▶프로그램

# include < stdio.h >

# define LOW 100
# define HIGH 300

void main ( )
{

int mid ;
mid = ( LOW + HIGH ) / 2 ;
printf ( " 평균값 = %d \n ", mid ) ;

}

▶실행 결과
평균값 = 200

 

★ 변수 ( Variables ) ★

변수는 상수를 기억시키기 위한 기억 장소를 말하는 것으로 기억 장소는 갖는 상수
의 데이터형 ( data type ) 에 따라 변수의 형이 결정된다.
또한, 숫자를 나타내는 상수의 기억을 위해서는 변수를 선언할 때 숫자 상수의 자료
길이에 따라 int , short , long 형 등으로 구분하여 선언해 준다.
C 언어 상에서 변수를 사용할 때는 반드시 데이터의 형을 선언해 주어야 한다.
또한, 사용자가 임의의 규칙에 따라 정하는 것으로 프로그램의 실행에 필요한 어떠
한 값을 기억시키기도 하고 기억된 값을 변경시킬 수도 있다.
프로그램에서 사용되는 변수의 이름 즉, 변수명을 지정할 때는 몇 가지 주의해야 할
규칙들이 있다.

1 . 변수명으로 사용 가능한 문자는 영문자 ( 대문자 A ~ Z , 소문자 a ~ z ) , 숫자 ( 0 ~
9 )와 밑줄문자 ( underscore )로 구성된다.

2 . 변수명의 첫 글자는 반드시 영문자 또는 밑줄문자 ( _ )로 시작해야 하며, 숫자나
다른 특수문자를 사용해서는 안 된다.

3. 변수명 지정시 영문자의 대소문자는 각각 다른 변수로 인식하기 때문에 구별하여
사용해야 한다.

4. 변수명 지정시 그 길이는 제한이 없지만 최대 32문자까지만 유효하다.

5. 변수명 중간에 공백 ( blank )을 두어서는 안 된다. 왜냐하면 변수명 중간에 공백
을 두면 컴파일러는 두 개의 변수로 간주하기 때문이다.

6. C 언어에서 사용되는 예약어는 변수명으로 사용할 수 없다.

 

< 정수형 변수 ( Integer variable ) >

정수혀 변수는 메모리 내부에 2바이트 ( byte )이 영역을 확보하며 unsigned 선언이
없으면 최상위 비트가 부호 비트가 된다.
정수형 변수는 정수의 값을 기억시킬 수 있는 변수로 가장 일반적인 형태는 int 로 메모
리에 1 워드 ( word ) 만큼의 용량이 확보되나 기종에 따라 워드 메모리 ( word memory ) 의
용량이 다르므로 다음의 4가지 정수형 변수를 선언할 수 있는 형식이 있다.

종 류 16 비트 컴퓨터 32 비트 컴퓨터
형 식
short

2 byte

2 byte

int

2 byte

4 byte

long

4 byte

4 byte

unsigned

2 byte

4 byte

int 선언시 16비트 상에서 -32768 ~ 32767 까지의 정수를 표현한다. 더 큰 값의 정수
를 표현하기 위해서는 long 형으로 선언하여 -2147483658 ~ 2147483647 까지 표현이 가
능하다.
그러나, 32비트 컴퓨터 상에서 int 를 선언할 때 무조건 4 바이트를 확보하게 되어 메
모리의 낭비만 가중시키는데 이때 사용하는 형식이 short 형으로 32비트 컴퓨터에서도
2 바이트를 확보하게 된다.
unsigned 형은 부호 없는 정수 즉, 무조건 부호 비트를 무시하고 모든 비트를 양수의
데이터 비트로 간주하여 출력하라는 의미를 지닌 %u와 같이 사용이 된다.

다음 프로그램의 실행 결과를 나타내시오 ( Turbo C 에서만 실행할 것 )

▶프로그램

# include < stdio.h >

void main ( )
{

int i = 32767 ;
unsigned j = 32767 ;
printf ( " %d   %d   %d " , i , i+1 , i+2 ) ;
printf ( " %u   %u   %u " , j , j+1 , j+2 ) ;

}

▶실행 결과

32767  -32768  -32767
32767 32768  32769

 

< 부동 소수점 변수 ( Floating point variable ) >

부동 소수점 변수란 소수점이 있는 실수 값의 기억을 위해 사용되는 변수로 사용 기
종과 데이터형의 종류에 따라 다음과 같이 나뉘어진다.

종 류 16 비트 컴퓨터 32 비트 컴퓨터
형 식
float 4 byte 4 byte
double 8 byte 8 byte

실수 표현은 단정도 실수형 ( float )과 배정도 실수형 ( double )으로 나뉘어지는데 이
중에 하나인 단정도 실수형 ( float )을 부동 소수점형이라 한다.
단정도 실수형 ( float )으로 선언된 변수는 메모리 내에 32비트의 공간을 확보하여 부
호 비트 ( sign bit ) 1 비트, 지수부 ( exponent part ) 7자리, 나머지의 소수부라고도 하는
가수부 ( fractional part ) 등으로 각 비트들이 나뉘어진다.
이때 수의 범위는 10진수로 까지 표시할 수 있으며 가수부는 10진수로
최대 7자리까지 유효 자리 수를 표시할 수 있다.
또한, 가수부와 지수부의 범위는 다음과 같다.


float 형은 기종에 상관없이 4바이트가 확보되며 소수점 이하 7자리까지 기억 가능하
다. 또한, double 형 역시 기종에 상관없이 8바이트가 확보되며 소수점 이하 16자리까지
기억 가능하다.
float 형과 double 형의 지수 범위는 까지 사용된다.
printf ( ) 함수와 같이 쓰는 출력 서식 중에 %f 는 10진 형태의 실수로 출력하라는 의
미이고, %e 는 지수 형태로 출력하라는 의미이다.

다음 프로그램의 실행 결과를 나타내시오

▶프로그램

# include < stdio.h >

void main ( )
{

float a , b , c ;
a = 12.345f ;
b = 0.12345e2f ;
c = 12345.0e - 3f ;
printf ( " %f   %f   %f \n " , a , b , c ) ;
printf ( " %e   %e   %e\n " , a , b , c ) ;

}

▶실행 결과

12.345000 12.345000    12.345000
1.234500e + 001  1.234500e + 001  1.234500e + 001

 

< 문자형 변수 ( Character variable ) >

문자형 변수는 메모리 내부에 1바이트의 공간을 확보하여, 데이터의 선언 부분에서
char 형으로 선언한다. 그리고 모든 문자는 컴퓨터에 기억될 때 그에 대응되는 ASCII
코드 값으로 기억된다.
문자형 변수는 단일 인용부호 ( '      ' )로 묶어 단 한 개의 문자만을 기억시킨다.
문자형 변수들은 기억될 때 정수 형태로 기억되며 한 바이트에 0 ~ 255
사이의 부호 없는 정수들이 기억된다.

 

다음 프로그램의 실행 결과를 나타내시오

▶프로그램

# include < stdio.h >

void main ( )
{

int p = 65 ;
char q = 'A' ;
printf ( " %c    %c   %c \n " , p , p+1 , p+2 ) ;
printf ( " %c    %c   %c \n " , q , q+1 , q+2 ) ;

}

▶실행 결과
A   B   C
A   B   C

 

다음 프로그램의 실행 결과를 나타내시오

▶프로그램

# include < stdio.h >

void main ( )
{

int  i = 12345 ;
float  x = 123.456 f ;
char a = ' C ' ;
printf ( " i = %d \n " , i ) ;
printf ( " Turbo  %c  Programming \n" , a ) ;
printf ( " x = %f \n " , x );

}

▶실행 결과
i = 12345
Turbo   C  Programming
x = 123.456001

 

다음 프로그램의 실행 결과를 나타내시오

▶프로그램

# include < stdio.h >

void main ( )
{

char a , b ;
a = ' A ' ;
b = ' B ' ;
printf ( " %c     %c     %c \n " , a , b , b , a ) ;

}

▶실행 결과
A B B A

 

★ 기본 자료형 ★

 

C 언어에서 사용되는 자료형의 종류는 [ 그림 2 - 4 ]와 같다.


[ 그림 2 - 4 ] C 언어의 기본 자료형

자료형은 크게 상수와 변수로 나누어진다. 상수는 변수에 기억되는 내용을 의미하고,
변수는 상수를 기억하는 기억 장소를 뜻한다. 이외에도 열거형 자료, 공용체 자료, 함수
형 자료 등이 있는데 추후에 자세히 설명하기로 하자.
C 언어에서 사용하는 모든 변수들은 사용 전에 그 자료 형태가 반드시 선언되어 있
어야 하며 동일한 자료 형태를 갖는 2개 이상의 변수는 콤마 ( , )로 구분하여야 한다. 또
한 변수에 대한 자료형 선언과 동시에 초기값을 지정할 수 있다.

< 정수형 : int , short , long , unsigned >

정수 자료형이 int형은 C 언어에서 많이 사용되는 자료형으로 부호가 있는 경우
( int )와 부호가 없는 경우 ( unsigned int )로 구분된다. 예를 들어 16비트 즉, 2바이트
( byte )를 1워드 ( word )로 계산하는 컴퓨터에서 int 형과 unsigned int 형의 구조를 나타
내면 다음과 같다.

0 15
S                              

S 부호 비트 ( 양수이면 0 , 음수이면 1로 표시 )
( a ) int 형의 경우

0 15
                               

( b ) unsigned int 형의 경우
[ 그림 2 - 2 ] int 형과 unsigned int 형의 구조

[ 그림 2 - 2 ] 에서와 같이 int 형은 부호 표시를 위해 1 비트를 사용하므로 unsigned int
형보다 나타낼 수 있는 정수 범위가 작다. 즉 , int 형은
까지 나타낼 수 있고, unsigned int 형은 까지 나타낼 수 있다.
위와 같은 정수형 ( short , long , unsigned 포함 ) 변수의 선언 형식은 다음과 같으며 ,
정수형 변수 리스트는 콤마 ( , ) 로 구분하여 여러 개의 변수를 나열할 수 있다.

형식

int 변수1 , 변수2 , ........ , 변수n ;
int 변수1 = 초기값1 , 변수2 = 초기값2 , ...... , 변수n = 초기값n ;

 

int a ;
int a , b , c ;
int a = 100 , b = 200 , c = 300 ;
short int k ;
long abc = 123456789 ;
unsigned int i ; 또는 unsigned i ;
unsigned short j ;
unsigned long k ;

 

< 부동 소수점형 : float , double >

실수 또는 부동 소수점수는 정수와는 다르게 소수점이나 지수부를 갖고 있는 수로서
지나치게 크거나 작은 수를 나타낼 때 사용한다. 특히 프로그램에서는 정수가 너무 크
거나 작은 경우를 제외하고는 E 표기를 사용하지 않는 것이 보통이지만 , C 언어 내부
에서는 실수의 크기에 관계 없이 모두 지수 형식으로 기억된다 . 그리고 부동 소수점수
는 자료 해석이나 통계, 선형 프로그램 등에 많이 사용된다.
부동 소수점수는 반드시 float , double 형으로 선언되어야 한다. double 형은 float 형보
다 2 배의 정밀도로 실수를 표현한다. 따라서 내부적으로 float 형보다 두 배의 기억 공
간을 필요로 한다. 보통 float 형은 32비트 ( 4 바이트 ) 를, double 형은 64비트를 사용한다.
그러므로 double 형은 float 형보다 큰 유효숫자 표현이 가능하다.
이러한 부동 소수점형은 소수점을 포함하여 지수부와 가수부로 나누는데, 지수가 1인
경우에는 생략이 가능하다.
지수형의 형태는 ±n.nE±n로 이루어지며 지수 및 소수 부분이 없는 경우는 정수로 취급한다.
부동 소수점형 ( float , double ) 의 일반 형식은 다음과 같다.

형식

float 변수1 , 변수2 , ........ , 변수n ;
float 변수1 = 초기값1 , 변수 2 = 초기값2 , .............. , 변수n = 초기값n ;

 

float a , b , c ;
float a= 0.21e5f ;
double a , b = 0.5e3 ;

 

< 문자형 : char >

문자 변수는 char형으로 선언된다. 각 문자 변수는 1바이트에 저장되어
지의 서로 다른 값을 저장할 수 있으나 실제 인쇄 가능한 문자는 그 중 일부이다 . 문자
변수의 선언 형식은 다음과 같다.

형식

char 변수1 , 변수2 , ........ , 변수n ;
char 변수1 = 초기값 , 변수2 = 초기값2 , ........ , 변수n = 초기값n ;

문자는 < 부록 > 에서와 같이 각각 ASCII 코드 값을 갖는데 단일 인용부호 ( '   ' ) 내의
문자 상수 값으로 표현된다. 이들 문자는 그 문자 집합에서 해당하는 숫자와 1 : 1로 대
응시켜 각 문자에 고유 번호를 부여한 다음 고유 번호 순으로 저장한다. 예를 들면
ASCII 코드 체계에서 A ,는 ( 65 )10  ' B '는 ( 66 )10 이며 ' a '는 ( 97 )10 이다. C 언어에서는
정수로 문자를 표현할 수 있기 때문에 char 나 int 로 선언된 것을 여러 가지 형태로 변환하여
사용할 수 있다.

char str ;
char str = ' A ' ;
char newline = ' \n ' , beep = ' \oo7 ' ;

 

★ 데이터형의 변환 ★

일반적으로 명령문이나 수식은 한 가지 자료형의 변수와 상수만을 사용한다. 그러나
어떤 경우에는 정수 또는 실수를 혼합하여 사용할 수도 있다. 이때 서로 다른 형의 오
퍼랜드 ( operand ) 들이 수식 안에 나타나면 자동적으로 변환 규칙에 의하여 데이터형의
변환이 이루어진다. 따라서 서로 다른 형의 오퍼랜드를 갖게 되면 연산이 수행되기 전
에 낮은 형에서 높은 형으로 변환이 이루어진 다음 연산을 수행한다.
데이터형들의 우선 순위를 나타내면 다음과 같다.

char < short < int < long < unsigned < float < double < long double

낮은형  높은형

특히 산술 연산자에 적용되는 변환 규칙은 다음과 같다.

1. char 형과 short 형은 int 형으로 변환되고 , float 형은 float 형이 명시되어 있으면
float 형으로 변환되고 , 명시되어 있지 않으면 double 형으로 변환된다.

char 형 변수 i 가 int 형으로 변환되어 결과가 출력되는 경우를 나타낸 것이다. 실행 결과를 나타내시오.

▶프로그램

# include < stdio.h >

void main ( )
{

char i = ' A ' ;
int j = 10 , k ;
k = i + j ;
printf ( " k = %d \n ", k ) ;

}

▶실행 결과
k = 75

2. 두 개의 오퍼랜드 중 어느 한 오퍼랜드가 double 형이면 나머지도 double 형으로
변환되며, 그 결과 역시 double 형이다.

3. 정수에서 어느 한 오퍼랜드가 long 형이면 나머지도 long 형으로 변환되고, 그 결
과 역시 long 형이다.

4. 정수에서 어느 한 오퍼랜드가 unsigned 형이면 나머지도 unsigned 형으로 변환되
고, 그 결과 역시 unsigned 형이다.

5. 두 오퍼랜드들이 int 형이면 그 결과 역시 int 형이다.

6. 데이터형의 변환은 대입문 ( assignment ) 에서도 일어난다. 이때, 오른쪽 연산식의
값이 왼쪽 변수의 데이터형으로 변환되어 저장된다.

다음 프로그램의 실행 결과를 나타내시오

▶프로그램

# include < stdio.h >

void main ( )

{

float a = 123.45678 ;
int i ;
i = a ;     /* i = ( int )a 로 변환 후 실행 */
printf ( " i = %d \n ", i ) ;

}

▶실행 결과
i = 123 ;

위의 예에서 알 수 있듯이 float 형으로 선언된 a 가 int 형으로 선언된 i 에 대입되어 그
결과가 대입문의 왼쪽 변수 i 에 데이터형으로 변환되는 과정에서 float형의 값 소수 부
분이 절단되었음을 알 수 있다.
또한 데이터형을 프로그래머가 강제적으로 변환할 수도 있는데 이것을 명시적 ( explicit )
변환이라 하며 cast 연산자를 이용한다. cast 연산자는 뒤에서 설명하기로 한다.

 

★ 데이터 타입 상수들 ★

[ 표 2 -2 ]는 정수형 데이터 타입에 대한 값의 허용 범위를 나타내는 데이터 타입 상
수들을 나타낸 것이다. 이들 상수들은 헤더 파일 < limits.h >에 정의되어 있다.
[ 표 2 - 2 ] 정수형 데이터에 대한 데이터 타입 상수들

상수 허용 값 의 미
SCHAR_MAX 127 signed char 의 최대값
SCHAR_MIN -128 signed char 의 최소값
UCHAR_MAX 255 ( 0xff ) unsigned char 의 최대값
CHAR_BIT 8 한 문자를 나타내는 비트 ( bit ) 수
USHRT_MAX 65535 ( 0xffff ) unsigned short 의 최대값
SHRT_MAX 32767 signed short 의 최대값
SHRT_MIN -32768 signed short 의 최소값
UINT_MAX 4294967295 ( 0xffffffff ) unsigned int 의 최대값
ULONG_MAX 4294967295 ( 0xffffffff ) unsigned long int 의 최대값
INT_MAX 2147483647 signed int 의 최대값
INT_MIN -2147483647 - 1 signed int 의 최소값
LONG_MAX 2147483647 signed long 의 최대값
LONG_MIN -2147483647 - 1 signed long 의 최소값
CHAR_MAX 127 ( 255 / j 옵션 사용시 ) char 의 최대값
CHAR_MIN -128 ( 0 / j 옵션 사용시 ) char 의 최소값
MB_LEN_MAX 2 multibyte char 의 최대 바이트 수

 

다음 프로그램의 실행 결과를 나타내시오

▶프로그램

// 자신의 시스템 환경에서 각 데이터 타입에 할당된 메모리 크기 확인하기

# include < limits.h >
# include < stdio.h >

void main ( )
{

// 할당된 메모리 크기를 바이트 단위로 계산
printf ( " \t 각 타입별 할당된 크기와 최대 / 최소 허용값 \n \n " ) ;
printf ( " 데이터 타입 \t Bytes \t 최대값 \t \t 최소값 \n " ) ;
printf ( " int  \t %d \t %d \t %d \n " , sizeof ( int ) , INT_MAX , INT_MIN ) ;
printf ( " short \t %d \t %d \t \t %d \n " , sizeof ( short ) , SHRT_MAX , SHRT_MIN ) ;
printf ( " long \t %ld \t %d \t %d \n ", sizeof ( long ) , LONG_MAX , LONG_MIN );

}

▶실행 결과

각  타입별 할당된 크기와 최대 / 최소 허용값
데이터 타입  Bytes  최대값    최소값
int  4 2147483647  - 2147483648
short  2 32767  32768
long  4 2147483647  2147483648

sizeof ( ) 함수는 헤더 파일 < stdio.h >에 정의되어 있는 라이브러리 함수로서, 전달
인수 ( argument )로 사용된 변수 ( 데이터 타입 , 배열 , 상수 등 )가 할당받은 메모리 크
기를 바이트 단위로 반환해 주는 함수이다. 여기서 결과는 컴퓨터시스템에 따라 다르게
나타날 수 있다.

다음 [ 표 2 - 3 ]은 double과 float 형에 대한 값의 허용 범위와 기타 특성들을 나타내는
데이터 타입 상수들을 나타낸 것이다. 이들 상수들은 헤더 파일 < float.h >에 정의되어
있다.

[ 표 2 -3 ] 실수형 데이터에 대한 데이터 타입 상수들

상수 허용 값 의 미
DBL_DIG 15 double 형 정밀도의 10진 자리수
DBL_MANT_DIG 53 double 형 가수부의 비트 수
DBL_MAX 1.7976931348623158e + 308 double 형 최대값
DBL_MAX_10_EXP 308 double 형 최대 10진 지수승의 값
DBL_MAX_EXP 1024 double 형 최대 2진 지수승의 값
DBL_MIN 2.2250738585072014e - 308 double 형 최소값 ( 양 수 )
DBL_MIN_10_EXP ( - 307 ) double 형 최소 10진 지수승의 값
DBL_MIN_EXP ( - 1021 ) double 형 최소 2진 지수승의 값
FLT_DIG 6 float 형 정밀도의 10진 자리수
FLT_MANT_DIG 24 float 형 가수부의 비트 수
FLT_MAX 3.402823466e + 38F float 형 최대값
FLT_MAX_10_EXP 38 float 형 최대 10진 지수승의 값
FLT_MAX_EXP 128 float 형 최대 2진 지수승의 값
FLT_MIN 1.175494351e - 38F float 형 최소값 ( 양 수 )
FLT_MIN_10_EXP ( -37 ) float 형 최소 10진 지수승의 값
FLT_MIN_EXP ( - 125 ) float 형 최소 2진 지수승의 값

 

다음 프로그램의 실행 결과를 나타내시오

▶프로그램

# include < float.h >
# include < stdio.h >

void main ( )
{

// 할당된 메모리 크기를 바이트 단위로 계산
printf ( " \t 각 타입별 할당된 크기와 최대 / 최소 허용값 \n \n " ) ;
printf ( " 데이터 타입 \t Bytes \t \t 최대값 \t \t \t 최소값 \n " ) ;
printf ( " float \t %d \t %20.9e \t %20.9e \n" , sizeof ( float ) , FLT_MAX ,       FLT_MIN ) ;
printf ( " double \t %d \t %20.16e \t %20.16e \n" , sizeof ( double ) , DBL_MAX , DBL_MIN ) ;

}

▶실행 결과

각 타입별 할당된 크기와 최대 / 최소 허용값
데이터 타입 Bytes  최대값  최소값
float  4 3.402823466e + 038  1.175494351e - 038
double   8 1.7976931348623157e + 308 2.2250738585072014e - 308