3 장기본자료형 0
선언, 수식, 배정 모든변수는사용되기전에반드시선언되어야함 일반적인프로그램의시작형태 #include <stdio.h> int main(void){ int a, b, c; /* declaration */ float x, y = 3.3, z = -7.7; /* declaration with initialization */ printf("input two integers: "); /* function call */ scanf("%d%d", &b, &c); /* function call */ a = b + c; /* assignment statement */ x = y + z; /* assignment statement */... 3-1
변수의메모리공간확보 올바른연산자선택 - int a, b, c; a = b + c; - float d, e, f; d = e + f; 변수선언의목적 - 위의두 + 는기호는같지만, 위의 + 는정수 + 이고, 밑의 + 는실수 + 임 3-2
참조 정수와실수연산이다른이유 - 컴퓨터에서정수와실수의표현방법이다르기때문 정수 - 부호가있는 2의보수로표현 - 1 비트 : 부호비트 (1 : 음수, 0 : 양수 ) - 나머지비트 : 수의 2의보수 3-3
참조 정수의표현 0 1 2... 31 부호 수의 2 의보수 예 2 : 00000000 00000000 00000000 00000010-2 : 11111111 11111111 11111111 11111110 3-4
참조 실수 - 부동소수로표현 - 모든수를지수형태로변환하여부호, 지수, 가수부로나누어저장 - IEEE 부동소수 3-5
참조 실수의표현 (IEEE 부동소수 ) 0 1 2... 8 9... 31 부호 지수부 가수부 (1 hidden bit) 예 2.0 = 1.0 ⅹ2 1 : 01000000 00000000 00000000 00000010 4.0 = 1.0 ⅹ2 2 : 01000000 10000000 00000000 00000010-2.0 = -1.0 ⅹ2 1 : 11000000 00000000 00000000 00000010 3-6
블록 블록, 수식, 문장 - 선언과문장이중괄호로둘러싸져있는것 - 선언은반드시문장앞에와야함 수식 - 상수, 변수, 연산자, 함수호출등의의미있는결합 - 상수, 변수, 함수호출은그자체가수식임 - 대부분의수식은값을가짐 3-7
블록, 수식, 문장 문장 - 수식뒤에세미콜론이오면, 수식은문장이됨 i = 7; - "i = 7" 은수식이고그값은 7임 - "i = 7;" 은문장임 3-8
기본자료형 완전한형태 char signed char unsigned char signed short int signed int signed long int unsigned short int unsigned int unsigned long int float double long double 축약된형태 char signed char unsigned char short int long unsigned short unsigned unsigned long float double long double 3-9
기본형의기능별분류 - 정수적형 char 기본자료형 signed char unsigned char short int long unsigned short unsigned unsigned long - 부동형 float double long double - 산술형 정수적형 + 부동형 3-10
문자 모든정수적형의변수는문자를표현하는데사용될수있음 'a', '+' 와같은상수는 char 형이아니라 int 형임 - C에는 char 형상수가없음 - C++ 에서문자상수는 char 형임 3-11
char 자료형 char 형변수는문자와정수값을저장하는데사용됨 보통각 char는메모리의 1 바이트에저장됨 - 256개의값을저장할수있음 - 이값들중일부분만이실제인쇄문자임 ( 소문자, 대문자, 숫자, 마침표, 특수문자등 ) - 공백, 탭, 개행문자같은여백도있음 대부분의컴퓨터는 ASCII나 EBCDIC 문자코드사용 3-12
ASCII 코드 ASCII 코드에서문자상수와대응되는정수값 문자상수대응하는값 문자상수대응하는값 문자상수대응하는값 문자상수대응하는값 'a' 'b' 'c'... 'z' 97 98 99... 122 'A' 'B' 'C'... 'Z' 65 66 67... 90 '0' '1' '2'... '9' 48 49 50... 57 '&' '*' '+' 38 42 43 3-13
ASCII 코드 주의 - 숫자를표현하는문자상수의코드값과실제그숫자값은특별한관계가없음 - 즉, '2' 의값은 2가아님 - 'a', 'b', 'c' 등의코드값은순서적임 - 이것은문자와단어를사전적순서로정렬할때편리함 3-14
탈출기법 인쇄할수없는문자는탈출기법을사용하여표현함 - 예를들어, 수평탭문자는문자상수와문자열에서 \t 로표현됨 - \t 가 \ 와 t 두문자로기술되지만, 이것은한문자임 프로그램내에서특별한의미를갖는문자들이본래의의미를갖기위해서도탈출기법을사용해야함 - 큰따옴표를포함하는 "abc" 라는문자열은 "\"abc\"" 로표기함 - 작은따옴표문자상수 ' 는 '\'' 로표기함 3-15
특수문자 문자이름 기술형태 정수값 경고역슬래시백스페이스캐리지리턴큰따옴표폼피드수평탭개형널문자작은따옴표수직탭 \a \\ \b \r \" \f \t \n \0 \' \v 7 92 8 13 34 12 9 10 0 39 11 3-16
char 형 각값은메모리에이진수로저장됨 예 ) char c = 'a'; - 변수 c 는메모리 1 바이트에 01100001 로저장됨 (ASCII 로저장 ) - 이값을계산하면 97 이됨 (ASCII 값 ) ANSI C 는 char, signed char, unsigned char 를제공 3-17
char 형 char는시스템에따라 signed char 또는 unsigned char와같음 세가지의 char 형은각각 1 바이트에저장됨 (256개의값표현 ) signed char 형의값의범위 : -128 ~ 127 unsigned char 형의범위 : 0 ~ 255 3-18
예제코드 1 char c = 'a'; printf("%c", c); /* a is printed */ printf("%d", c); /* 97 is printed */ printf("%c%c%c", c, c + 1, c + 2); /* abc is printed */ 3-19
char c; int i; 예제코드 (2) for (i = 'a'; i <= 'z'; ++i) printf("%c", i); /* abc... z is printed */ for (c = 65; c <= 90; ++c) printf("%c", c); /* ABC... Z is printed */ for (c = '0'; c <= '9'; ++c) printf("%d ", c); /* 48 49... 57 is printed */ 3-20
int 자료형 C 언어의기본적인자료형 int 형은 2 바이트 (= 16 비트 ) 나 4 바이트 (= 32 비트 ) 에저장됨 - 즉, 정수의일부분만저장할수있음 3-21
int 자료형 값의범위 - 4 바이트워드컴퓨터 - 최소 = -2 31 = -2147483648 - 최대 = +2 31-1 = +2147483647-2 바이트워드컴퓨터 - 최소 = -2 15 = -32768 - 최대 = +2 15-1 = +32767 3-22
int 자료형 정수오버플로 - 값의범위를초과할때발생 ( 주의필요 ) #define BIG 2000000000 /* 2 billion */ int main(void){ int a, b = BIG, c = BIG; a = b + c; /* out of range? */... - 정수오버플로가발생해도프로그램은계속수행되지만, 논리적으로부정확한값이계산됨 3-23
정수적형 short, long, unsigned short 자료형은기억장소를절약하고자하는경우에사용 long 형은큰정수값을다룰때사용 short 형은 2 바이트에저장되고, long 형은 4 바이트에저장됨 - 4 바이트워드컴퓨터 : int 형과 long 형크기같음 - 2 바이트워드컴퓨터 : int 형과 short 형크기같 음 unsigned 형의변수는음수가아닌정수를표현할때사용함 3-24
정수적형 short, long, unsigned 정수상수에그형을명시하기위해서는접미사를붙일수있음 접미사가붙지않은정수상수의형은 int, long, unsigned long 중하나임 - 시스템은세가지형중그정수상수를표현할수있는첫번째것을선택하여그정수상수의형으로함 - 예를들어, 2 바이트워드컴퓨터에서상수 32000 은 int 형이고, 33000 은 long 형임 3-25
접미사 정수적형 short, long, unsigned u 또는 U l 또는 L ul 또 는 UL unsigned long unsigned long 37U 37L 37UL 3-26
부동형 실수값을다루기위해사용함 정수를부동형상수로표현할때에는소수점을사용해야함 - 상수 1.0 과 2.0 은 double 형이지만, - 상수 3 은 int 형임 접미사 f 또는 F l 또는 L float long double 3.7F 3.7L 3-27
부동형상수표기법 십진표기법 - 1.0 또는 1. 또는.0001 지수표기법 - 1.234567e5 (= 1.234567 X 10 5 ) 올바른부동형상수 - 3.14159, 314.159e-2F, 0e0, 1. 3-28
잘못된부동형상수 부동형상수표기법 - 3.14,159 /* comma not allowed */ - 314159 /* decimal point or exponential part needed */ -.e0 /* integer part or fractional part needed */ - -3.14159 /* this is a floating constant expression */ 3-29
부동형의값의범위 부동형에배정될수있는값은정밀도와범위라는속성으로기술됨 - 정밀도 : 부동형값이가질수있는유효숫자수 - 범위 : 부동형의변수에저장될수있는가장큰양수와가장작은양수의한계 3-30
부동형의값의범위 float 형 - 정밀도 : 대략유효숫자 6자리 - 범위 : 대략 10-38 에서 10 +38 double 형 - 정밀도 : 대략유효숫자 15자리 - 범위 : 대략 10-308 에서 10 +308 3-31
예제 x = 123.45123451234512345; - x의실제값 - double : 0.123451234512345 10 3 - float : 0.123451 10 3 주의 - 모든실수를다표현할수는없다. - 정수산술연산과달리부동형산술연산은정확하지않다. 3-32
typedef typedef의목적 - 긴선언문을축약해쓸수있음 - 사용목적에맞게형이름을결정할수있음 - 프로그램이식을쉽게할수있게함 예제 typedef char uppercase; typedef int INCHES, FEET; uppercase u; INCHES length, width; 3-33
sizeof 객체를저장하는데필요한바이트수를알아내기위해사용 다른단항연산자와동일한우선순위와결합법칙을가짐 사용법 - sizeof(object) 3-34
기본형들의크기비교 sizeof(char) = 1 sizeof sizeof(short) <= sizeof(int) <= sizeof(long) sizeof(signed) = sizeof(unsigned) = sizeof(int) sizeof(float) <= sizeof(double) <= sizeof(long double) 3-35
getchar() 와 putchar() stdio.h 에정의된매크로 - getchar() : 키보드에서문자를읽음 - putchar() : 화면에문자를출력함 char 형은 1 바이트, int 형은 2 바이트나 4 바이트에저장됨 - int 형은 char 형이저장할수있는모든값과그이상을저장할수있음 - char 형을작은정수형으로생각할수있음 - 반대로 int 형을큰문자형으로볼수있음 3-36
getchar() 와 putchar() 예제프로그램 #include <stdio.h> int main(void){ int c; while ((c = getchar())!= EOF) { /* #define EOF (-1) */ putchar(c); putchar(c); } return 0; } ( 주의 ) c 가 char 가아니라 int 로선언되어있음 3-37
예제 /* In file capitalize.c */ #include <stdio.h> int main(void){ int c; while ((c = getchar())!= EOF) if (c >= 'a' && c <= 'z') putchar(c + 'A' - 'a'); else putchar(c); return 0; } 3-38
수학함수 C 에는수학함수가내장되어있지않음 다음과같은수학함수는표준라이브러리의일부분인수학라이브러리로제공됨 sqrt() pow() exp() log() sin() cos() tan() 이러한수학함수를사용하기위해서는 <math.h> 를포함시켜야함 3-39
수학함수 정수용 abs() 와실수용 fabs() 를구별해서사용해야함 UNIX에서는수학라이브러리가표준라이브러리가아니기때문에수학라이브러리를사용하는경우컴파일할때명시해야함 cc pgm.c -lm 3-40
수학함수예제프로그램 #include <math.h> #include <stdio.h> int main(void){ double x;.... } printf("\n%15s%22.15e\n%15s%22.15e\n%15s%22. 15e\n\n", "x = ", x, "sqrt(x) = ", sqrt(x), "pow(x, x) = ", pow(x, x));.... 3-41
변환 산술수식은값과형을가짐 필요에따라수식을구성하는형들은변환이일어남 정수적승격 - signed/unsigned char, signed/unsigned short, 열거형, signed/unsigned int는정수적수식에사용될수있음 - 이수식에서모든형들은 int나 unsigned int로변환됨 3-42
예 char c = 'A'; printf("%c\n", c); 변환 - printf 에서 c 는정수적승격이일어나 int 형 이됨 3-43
일반적인산술변환 산술변환은이항연산자의피연산자를계산할때일어남 규칙둘중하나가 long double 형이면, 다른하나는 long double 형으로변환아니면, 둘중하나가 double 형이면, 다른하나는 double 형으로변환아니면, 둘중하나가 float 형이면, 다른하나는 float 형으로변환아니면, 정수적승격이일어나고, 다음규칙사용 : 둘중하나가 unsigned long 형이면, 다른하나는 unsigned long 형으로변환아니면, 둘중하나가 long 형이고다른하나가 unsigned 형이면, 다음수행 : 만일 long 형이 unsigned 형의모든값을표현할수있다면, unsigned 형은 long 형으로변환아니면, 두피연산자는 unsigned long 형으로변환아니면, 둘중하나가 long 형이면, 다른하나는 long 형으로변환아니면, 둘중하나가 unsigned 형이면, 다른하나는 unsigned 형으로변환아니면, 두피연산자는 int 형을가짐 3-44
일반적인산술변환 자동변환 묵시적변환 강압 승격 확대 3-45
자동변환예제 선언 char c; short s; int i; long l; unsigned u; unsigned long ul; float f; double d; long double ld; 수식 형 수식 형 c - s / i int u * 7 - i unsigned u * 2.0 - i double f * 7 - i float c + 3 c + 5.0 d + s 2 * i / l int double double long 7 * s * ul ld + c u - ul u l unsigned long long double unsigned long systemdependent 3-46
캐스트 명시적인변환 캐스트예제 (double) i (long) ('A' + 1.0) x = (float) ((int) y + 1) (double) (x = 77) 잘못된캐스트 (double) x = 77 /* equivalent to ((double) x) = 77, error */ 3-47
16 진상수와 8 진상수 C 원시코드에서 0으로시작하는양의정수상수는 8 진정수이고 0x 또는 0X로시작하는양의정수상수는 16진정수임 3-48
16 진상수와 8 진상수 #include <stdio.h> int main(void) { printf("%d %x %o\n", 19, 19, 19); /* 19 13 23 */ printf("%d %x %o\n", 0x1c, 0x1c, 0x1c); /* 28 1c 34 */ printf("%d %x %o\n", 017, 017, 017); /* 15 f 17 */ printf("%d\n", 11 + 0x11 + 011); /* 37 */ printf("%x\n", 2097151); /* 1fffff */ printf("%d\n", 0x1FfFFf); /* 2097151 */ return 0; } 3-49