5장. 상수와 기본 자료형
5-1 C 언어가 제공하는 기본 자료형 자료형(data type) 기본 자료형 사용자 정의 자료형 int val; "선언할 변수의 특징을 나타내기 위한 키워드" 기본 자료형 기본적으로 제공이 되는 자료형 사용자 정의 자료형 사용자가 정의하는 자료형 : 구조체, 공용체 int val;
5-1 C 언어가 제공하는 기본 자료형 기본 자료형 종류와 데이터의 표현 범위 자료형(data type) 할당되는 메모리 크기 표현 가능한 데이터의 범위 정 수 형 char 1 바이트 -128 ~ +127 short 2 바이트 -32768 ~ +32767 int 4 바이트 -2147483648 ~ +2147483647 long 실 float 3.4*10-37 ~ 3.4*10+38 double 8 바이트 1.7*10-307 ~ 1.7*10+308 long double 8 바이트 혹은 그 이상 차이를 많이 보임
5-1 C 언어가 제공하는 기본 자료형 다양한 자료형이 제공되는 이유 데이터의 표현 방식이 다르기 때문 정수형 데이터를 표현하는 방식 실수형 데이터를 표현하는 방식 메모리 공간을 적절히 사용하기 위해서 데이터의 표현 범위를 고려해서 자료형 선택 작은 메모리 공간에 큰 데이터를 저장하는 경우 데이터 손실이 발생할 수 있음
5-1 C 언어가 제공하는 기본 자료형 sizeof 연산자 피연산자의 메모리 크기를 반환 피연산자로 자료형의 이름이 올 경우 괄호를 사용 그 이외의 경우 괄호의 사용은 선택적 예제 sizeof.c 참조 int main(void) { int val=10; printf(“%d”, sizeof val ); // 변수 val의 메모리 크기 출력 printf(“%d”, sizeof(int) ); // 자료형 int의 메모리 크기 출력 . . . . .
5-1 C 언어가 제공하는 기본 자료형 자료형 선택의 기준 정수형 데이터를 처리하는 경우 컴퓨터는 내부적으로 int형 연산을 가장 빠르게 처리, 따라서 정수형 변수는 int형으로 선언 범위가 int형 변수를 넘어가는 경우 long형으로 선언 값의 범위가 –128 ~ +127 사이라 할지라도 int형으로 선언 예제 char_add.c 참조
5-1 C 언어가 제공하는 기본 자료형 자료형 선택의 기준 실수형 데이터를 처리하는 경우 선택의 지표는 정밀도 정밀도란 오차 없이 표현 가능한 정도를 의미함 오늘날의 일반적 선택은 double! 예제 circle_area.c 참조 자료형 정밀도 float 소수 이하 6자리 double 소수 이하 15자리 long double double의 정밀도와 같거나 크다.
unsigned가 붙어서 달라지는 표현의 범위 5-1 C 언어가 제공하는 기본 자료형 unsigned가 붙어서 달라지는 표현의 범위 MSB까지도 데이터의 크기를 표현하는데 사용 양의 정수로 인식 실수형 자료형에는 붙일 수 없다. 자료형 메모리 크기 표현 가능한 데이터의 범위 char(signed char) 1바이트 -128 ~ +127 unsigned char 0 ~ (127 + 128) short(signed short) 2바이트 -32768 ~ +32767 unsigned short 0 ~ (32767 + 32768) int(signed int) 4바이트 -2147483648 ~ +2147483647 unsigned int 0 ~ (2147483647 + 2147483648) long(signed long) unsigned long
5-1 C 언어가 제공하는 기본 자료형 문자 표현을 위한 ASCII 코드의 등장 미국 표준 협회(ANSI)에 의해 정의 컴퓨터를 통해서 문자를 표현하기 위한 표준 컴퓨터는 문자를 표현하지 못함 문자와 숫자의 연결 관계를 정의 문자 A는 숫자 65, 문자 B는 숫자 66…
5-1 C 언어가 제공하는 기본 자료형 ASCII 코드의 범위 문자의 표현 0이상 127이하, char형 변수로 처리 가능 따옴표(' ')를 이용해서 표현 예제 how_char.c 참조 그림 5-1
5-2 상수에 대한 이해 리터럴(literal) 상수 이름을 지니지 않는 상수 그림 5-2 int main(void) { 5-2 상수에 대한 이해 리터럴(literal) 상수 이름을 지니지 않는 상수 int main(void) { int val = 30 + 40; . . . . . 그림 5-2
5-2 상수에 대한 이해 리터럴 상수의 기본 자료형 상수도 메모리 공간에 저장되기 위해서 자료형이 결정된다. 5-2 상수에 대한 이해 리터럴 상수의 기본 자료형 상수도 메모리 공간에 저장되기 위해서 자료형이 결정된다. int main(void) { char c = ‘A’; // 문자상수(char) int i = 5; // 정수상수(int) double d= 3.15; // 실수상수(double) . . . . .
5-2 상수에 대한 이해 리터럴 상수의 기본 자료형 int main(void) { float f = 3.14; // float f= 3.14f return 0; } warning C4305: 'initializing' : truncation from 'const double ' to 'float '
5-2 상수에 대한 이해 접미사에 따른 다양한 상수의 표현 접미사 자료형 사용 예 u or U unsigned int 304U 5-2 상수에 대한 이해 접미사에 따른 다양한 상수의 표현 접미사 자료형 사용 예 u or U unsigned int 304U l or L long 304L ul or UL unsigned long 304UL f or F float 3.15F long double 3.15L
5-2 상수에 대한 이해 심볼릭(symbolic) 상수 심볼릭 상수를 정의하는 방법 이름을 지니는 상수 5-2 상수에 대한 이해 심볼릭(symbolic) 상수 이름을 지니는 상수 심볼릭 상수를 정의하는 방법 const 키워드를 통한 변수의 상수화 매크로를 이용한 상수의 정의
5-2 상수에 대한 이해 const 키워드에 의한 상수화 잘못된 상수 선언 int main(void) { 5-2 상수에 대한 이해 const 키워드에 의한 상수화 int main(void) { const int MAX=100; const double PI=3.1415; . . . . . } 잘못된 상수 선언 int main(void) { const int MAX; MAX=100; . . . . . }
5-3 자료형 변환에 대한 이야기 자료형 변환의 두 가지 형태 자동 형 변환 강제 형 변환 5-3 자료형 변환에 대한 이야기 자료형 변환의 두 가지 형태 자동 형 변환 자동적으로 발생하는 형태의 변환을 의미한다. 묵시적 형 변환이라고도 표현한다. 강제 형 변환 프로그래머가 명시적으로 형 변환을 요청하는 형태의 변환 명시적 형 변환이라고도 표현한다.
5-3 자료형 변환에 대한 이야기 자동 형 변환이 발생하는 상황 1 대입 연산 시 예제 auto_conv1.c 참조 5-3 자료형 변환에 대한 이야기 자동 형 변환이 발생하는 상황 1 대입 연산 시 예제 auto_conv1.c 참조 int main(void) { int n=5.25; // 소수부의 손실 double d=3; // 값의 표현이 넓은 범위로의 변환 char c=129; // 상위 비트의 손실
5-3 자료형 변환에 대한 이야기 자동 형 변환이 발생하는 상황 2 정수의 승격에 의해(int형 연산이 빠른 이유) 5-3 자료형 변환에 대한 이야기 자동 형 변환이 발생하는 상황 2 정수의 승격에 의해(int형 연산이 빠른 이유) 정수형 연산 자체를 단일화시킨 결과 int main(void) { char c1=10, c2=20; char c3=c1+c2; . . . . .
5-3 자료형 변환에 대한 이야기 자동 형 변환이 발생하는 상황 3 산술 연산 과정에 의해 int main(void) { 5-3 자료형 변환에 대한 이야기 자동 형 변환이 발생하는 상황 3 산술 연산 과정에 의해 int main(void) { double e1 = 5.5 + 7; // double + int double e2 = 3.14f+5.25; // float + double . . . . .
5-3 자료형 변환에 대한 이야기 산술 연산 형 변환 규칙 데이터의 손실이 최소화되는 방향으로... 그림 5-5
5-3 자료형 변환에 대한 이야기 강제 형 변환 프로그래머의 요청에 의한 형 변환 예제 conv_div.c 참조 5-3 자료형 변환에 대한 이야기 강제 형 변환 프로그래머의 요청에 의한 형 변환 예제 conv_div.c 참조 float f= (float)3.14; // 3.14를 float 형으로 형 변환 double e1 = 3 + 3.14; //정수 3이 double 형으로 자동 형 변환 double e2 = 3 + (int)3.14; // 3.14가 int형으로 강제 형 변환