상수와 기본 자료형
5-1 C 언어가 제공하는 기본 자료형 자료형(data type) 기본 자료형 사용자 정의 자료형 "선언할 변수의 특징을 나타내기 위한 키워드" 기본 자료형 기본적으로 제공이 되는 자료형 사용자 정의 자료형 사용자가 정의하는 자료형 : 구조체, 공용체
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
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의 메모리 크기 출력 . . . . .
sizeof 연산자 #include <stdio.h> int main(void) { char c=10; int i=3048; double f=3.1415; printf("변수 c의 크기 : %d \n", sizeof c); printf("변수 i의 크기 : %d \n", sizeof i); printf("변수 f의 크기 : %d \n", sizeof f); printf("char 할당 메모리 : %d \n", sizeof(char)); printf("int 할당 메모리 : %d \n", sizeof(int)); printf("double 할당 메모리 : %d \n", sizeof(double)); return 0; }
5-1 C 언어가 제공하는 기본 자료형 자료형 선택의 기준 정수형 데이터를 처리하는 경우 컴퓨터는 내부적으로 int형 연산을 가장 빠르게 처리, 따라서 정수형 변수는 int형으로 선언 범위가 int형 변수를 넘어가는 경우 long형으로 선언 값의 범위가 –128 ~ +127 사이라 할지라도 int형으로 선언 예제 char_add.c 참조
/* char_add.c */ #include <stdio.h> int main(void) { char a, b; char result; printf("-50 이상 +50 이하의 수 둘 입력 : "); scanf("%d %d", &a, &b); result=a+b; printf("두 수의 덧셈 결과 : %d \n", result); return 0; }
5-1 C 언어가 제공하는 기본 자료형 자료형 선택의 기준 실수형 데이터를 처리하는 경우 선택의 지표는 정밀도 정밀도란 오차 없이 표현 가능한 정도를 의미함 오늘날의 일반적 선택은 double! 예제 circle_area.c 참조 자료형 정밀도 float 소수 이하 6자리 double 소수 이하 15자리 long double double의 정밀도와 같거나 크다.
/* circle_area.c */ #include <stdio.h> int main(void) { double radius; double area; printf("원의 반지름 입력 : "); scanf("%lf", &radius); area = radius*radius*3.1415; printf("원의 넓이 : %f \n", area); return 0; }
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… American Standard Code for Information Interchange American National Standards Institute
문자 표현(ASCII) /*how_char.c*/ #include <stdio.h> int main(void) { char ch1='A'; char ch2=65; printf("%d %d \n", ch1, ch2); printf("%c %c \n", ch1, ch2); return 0; }
5-1 C 언어가 제공하는 기본 자료형 ASCII 코드의 범위 문자의 표현 0이상 127이하, char형 변수로 처리 가능 따옴표(' ')를 이용해서 표현 예제 how_char.c 참조 그림 5-1
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; . . . . . }
#include <stdio.h> int main(void) { double radius; double area; const double PI=3.1415; printf("원의 반지름 입력 : "); scanf("%lf", &radius); area = radius*radius*PI; printf("원의 넓이 : %f \n", area); return 0; }
5-3 자료형 변환에 대한 이야기 자료형 변환의 두 가지 형태 자동 형 변환 강제 형 변환 5-3 자료형 변환에 대한 이야기 자료형 변환의 두 가지 형태 자동 형 변환 자동적으로 발생하는 형태의 변환을 의미한다. 묵시적 형 변환이라고도 표현한다. 강제 형 변환 프로그래머가 명시적으로 형 변환을 요청하는 형태의 변환 명시적 형 변환이라고도 표현한다.
5-3 자료형 변환에 대한 이야기 자동 형 변환이 발생하는 상황 1 대입 연산 시 예제 auto_conv1.c 참조 5-3 자료형 변환에 대한 이야기 자동 형 변환이 발생하는 상황 1 대입 연산 시 예제 auto_conv1.c 참조 #include <stdio.h> int main(void) { int n=5.25; // 소수부의 손실 double d=3; // 값의 표현이 넓은 범위로의 변환 char c=129; // 상위 비트의 손실 printf("%d, %f, %d \n", n, d, c); return 0; }
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 = (double)3 + 3.14; //정수 3이 double 형으로 강제 형 변환 double e2 = 3 + (int)3.14; // 3.14가 int형으로 강제 형 변환 int main(void) { int a=1; int b=2; float f = a/b; printf("나눗셈 결과 : %f \n", f); return 0; }
printf와 scanf 함수에 대한 고찰
printf 함수 이야기 printf는 문자열을 출력하는 함수이다. printf는 특수 문자 출력이 가능하다. 특수 문자 의 미 \a 경고음 소리 발생 \b 백스페이스(backspace) \f 폼 피드(form feed) \n 개행 \r 캐리지 리턴(carriage return) \t 수평 탭 \v 수직 탭 \\ 백슬래시(\) \’ 작은 따옴표 \” 큰 따옴표
printf 함수 이야기 특수 문자가 필요한 이유 잘못된 문자열 출력 그림 6-1 #include <stdio.h> int main(void) { printf("앞집 강아지가 말했다. "멍! 멍!" 정말 귀엽다."); return 0; } 그림 6-1
printf 함수 이야기 printf 함수는 서식 지정이 가능하다. printf의 f는 "formatted"를 의미한다. 서식 지정 : 출력의 형태를 지정한다는 의미 (ex : 문자열 안에 숫자 삽입) 서식 지정의 예 #include <stdio.h> int main(void) { int age=12; printf("10진수로 %d살이고 16진수로 %x살 입니다.", age, age); return 0; }
printf 함수 이야기 서식 문자의 종류와 그 의미 서식 문자 출력 형태 %c 단일 문자 %d 부호 있는 10진 정수 %i 부호 있는 10진 실수 %s 문자열 %o 부호 없는 8진 정수 %u 부호 없는 10진 정수 %x 부호 없는 16진 정수, 소문자 사용 %X 부호 없는 16진 정수, 대문자 사용 %e e 표기법에 의한 실수 %E E 표기법에 의한 실수 %g 값에 따라서 %f, %e 둘 중 하나를 선택 %G 값에 따라서 %f, %G 둘 중 하나를 선택 %% % 기호 출력
printf 함수 이야기 %c, %d, %f, %lf, %s %o, %u, %x, %X %e, %E 가장 많이 쓰이는 서식 문자들 %o, %u, %x, %X 부호 없는 정수형 출력 %e, %E '부동소수점 표현 방식'에 의한 출력 3.1245e+2 3.1245×10+2 2.45e-4 2.45×10-4
printf 함수 이야기 필드 폭을 지정하여 멋진 출력을! 서식 문자를 이용해서 출력의 폭 지정 가능 예제 field_wid.c 참조 서식 문자 출력의 형태 %8d 필드 폭을 8칸 확보하고 오른쪽 정렬해서 출력하라. %-8d 필드 폭을 8칸 확보하고 왼쪽 정렬해서 출력하라. %+8d 필드 폭을 8칸 확보하고 오른쪽 정렬한 상태에서 양수는 +, 음수는 –를 붙여서 출력하라.
필드 폭 지정 #include <stdio.h> int main(void) { printf("/%12d/ /%12d/ /%12d/ \n", 100, 200, 300); printf("/%+12d/ /%+12d/ /%+12d/ \n", 100, 200, 300); printf("/%-12d/ /%-12d/ /%-12d/ \n", 100, 200, 300); return 0; }
필드 폭 지정 #include <stdio.h> int main(void) { printf("12345678901234567890\n"); // 열 번호 출력 printf("%10c\n", 'A'); // 문자 출력 printf("%10d\n", 128); // 정수값 출력 printf("%10.3f\n", 3.1415926);// 소수점 이하3자리까지만 출력 printf("%10.4s\n", "Love is"); // 문자열에서 앞의 4문자만 출력 return 0; }