C 프로그래밍및실습 2. 변수와자료형 세종대학교 목차 1) 변수와자료형개요 4) 부동소수자료형 6) 자료형변환 2
1) 변수와자료형개요 변수 : 값을담을그릇 자료형 : 그릇의모양 이그릇안에 10+20 의결과저장 자료형 int main() { int c ; c=10+20; 변수 int 30 c printf("c=10+20 출력 :"); printf("%d", c); 모양이 int 형이고, 이름이 C 인그릇 } return 0; 3 1) 변수와자료형개요 변수 값을저장하기위한기억장소 사용하기전에반드시선언 int c; 자료형 자료값의형태 컴퓨터내부에서값이저장되고처리되는방식을결정짓는매우중요한요소 상수 변하지않는수로변수와대비되는개념 10, 20, 30 과같은특정값 4
변수선언 int c ; 자료형을앞에명시한후사용할변수이름을적음 변수선언도하나의문장이므로세미콜론을붙여야함 예 ) int num; int 형변수 num 선언 char ch; char 형변수 ch 선언 float x; float 형변수 x 선언 double y; double 형변수 y 선언 int, char, float, double : 자료형이름, 미리정해진단어 num, ch, x, y : 변수이름, 프로그래머가지은단어 5 다양한변수선언의형태 int a; double b; int c; double d; int a,b; double b,d; int a, float b; float d, int c; (X) 1 가능 2 가능 3 불가능 6
변수값저장 선언된변수에값을저장하기위해서는대입연산자 '=' 사용 왼쪽변수에오른쪽의값을대입 ( 저장 ) 하라는의미 c = 10 + 20 ; c 10 + 20 수학에서사용되는등호 (=) 와는다른의미 변수에새로운값을대입하면이전값은사라짐 age = 20; age = 21; // 이전에저장한 20 은사라짐 7 변수값참조 변수이름사용 printf("%d", c); 여기서 c는변수에저장된값을의미 변수의위치에따라의미다름 대입연산자왼쪽 : 저장공간자체 대입연산자오른쪽 : 저장된값 a = b; 변수 a에변수 b의값대입 b = a; 변수 b에변수 a의값대입 a = a + 10; 이런문장도가능 8
[ 예제 2.1] 변수선언과사용 int main() { int id; int credits; 학번 : 20160120 신청학점 : 18 id = 20160120; // 변수 id 에값대입 ( 저장 ) credits = 18; } printf(" 학번 : %d\n", id); // 변수 id 값출력 ( 참조 ) printf(" 신청학점 : %d\n", credits); return 0; 9 변수초기화 변수를선언만하고값을대입하지않으면쓰레기값 (garbage value) 이저장되어있음 선언과동시에변수값지정 ( 변수초기화 ) int num = 123; 여러변수동시초기화가능, 일부변수만초기화가능 int a, b, c; a = 123; b = 456; int a = 123, b = 456, c; 10
[ 예제 2.2] 변수초기화 int main() { int math = 99; int korean = 90; [ 빈칸 ] // int 형변수 math 선언후 99 로초기화 // 더하기기호인 + 를사용하여총합을변수 total 에저장 int total = math + korean + science; printf(" 수학 : %d\n", math); // 변수값출력 printf(" 국어 : %d\n", korean); printf(" 과학 : %d\n", science); [ 빈칸 ] 수학 : 99 국어 : 90 과학 : 94 총점 : 283 } return 0; 11 키워드 C 언어에서특별한의미를가지도록미리정해놓은단어 예 ) char, int, double 등기본자료형, 이외에도많음 식별자 변수처럼프로그래머가지어서사용하는이름 식별자로사용할수없는이름의예 num-01 num.a 밑줄이아닌특수문자는사용할수없음 3card 999 첫문자에숫자사용할수없음 int char 키워드는사용할수없음 12
목차 1) 변수와자료형개요 4) 부동소수자료형 6) 자료형변환 13 정수자료형종류 int : 정수를나타내는가장기본적인자료형 short, long, long long : 정수를나타내지만자료형의크기가다름 short int long long long 같은자료형이라도시스템마다크기가다를수있음 자료형의크기는 sizeof 연산자를이용하여확인 printf("long : %d\n", sizeof(long) ); 자료형의크기는표현할수있는수의범위결정 예 ) int 의크기는보통 4 바이트 (32 비트 ) 로총 2 32 개의수표현가능반은음수, 나머지반은 0 과양수를표현하여 -2 31 ~ 2 31 1 사이의정수를나타냄 14
signed 와 unsigned signed : 음수와양수모두표현 unsigned : 0과양수만표현 ( 음수표현불가 ) int, short 등의앞에부호여부명시해주면됨 예 ) unsigned int, signed short 명시하지않으면기본적으로 signed 즉, int = signed int 15 정수자료형의크기및표현할수있는값의범위 VS 2017 기준 부호 자료형 메모리크기 값의범위 short 2 bytes 2 15 ~ 2 15 1 있음 int 4 bytes 2 31 ~ 2 31 1 long 4 bytes 2 31 ~ 2 31 1 long long 8 bytes 2 63 ~ 2 63 1 unsigned short 2 bytes 0 ~ 65,535 없음 unsigned int 4 bytes 0 ~ 4,294,967,295 unsigned long 4 bytes 0 ~ 4,294,967,295 unsigned long long 8 bytes 0 ~ 18,446,744,073,709,551,615 16
다양한정수자료형사용하기 저장값 : 32000 2140000000 int main() 저장값 : 65000 4280000000 { short svar = 32000; // 32768 ~ 32767 int ivar = 2140000000; // 약 21억 ~ 21억정도 unsigned short usvar = 65000; // 0 ~ 65535 unsigned int uivar = 4280000000; // 0 ~ 42 억정도 printf(" 저장값 : %d %d\n", svar, ivar); printf(" 저장값 : %u %u\n", usvar, uivar); unsigned 값을출력할경우 %u 사용 } return 0; 17 [ 예제 2.3] 이전프로그램에서다음과같이각자료형이나타낼수있는최댓값또는최솟값으로초기화하여출력해보자. short svar = 32768; int ivar = 2147483647; 최솟값 최댓값 unsigned short usvar = 65535; unsigned int uivar = 4294967295; 최댓값 최댓값 결과는? 18
[ 예제 2.4] 이전프로그림에서다음과같이각자료형이나타낼수있는수의범위를벗어난값으로초기화하여출력해보자. short svar = 72000; int ivar = 2150000000; unsigned short usvar = 1000; unsigned int uivar = 4294967300; 결과는? 19 [ 예제 2.5] 이전프로그램에서다음과같이각자료형이나타낼수있는최댓값보다 1 큰수또는최솟값보다 1 작은수로초기화하여출력해보자. short svar = 32768 1; 최솟값 1 int ivar = 2147483647+1; 최댓값 + 1 unsigned short usvar = 0 1; 최솟값 1 unsigned int uivar = 4294967295+1; 최댓값 + 1 결과는? 20
목차 1) 변수와자료형개요 4) 부동소수자료형 6) 자료형변환 21 4) 부동소수자료형 부동소수 (floating point) 형종류 3.14, 3.26567과같이실수를표현하는자료형 자료형키워드 : float, double, long double 부동소수형출력 : printf의서식지정자 '%f' 사용 float x = 3.14; double y = 3.141592; printf("x: %f\n", x); 부동소수형출력시 %f 사용 printf("y: %f\n", y); 부동소수형출력시 %f 사용 22
4) 부동소수자료형 부동소수형표현방식 0.000023의다른표현 2.3 x 10-5 컴퓨터에서는후자의방식으로표현 컴퓨터에서정수 3 과부동소수 3.0 은전혀다름 double x = 3.0; printf("x: %f\n", x); 부동소수형으로출력 ( 정상 ) printf("x: %d\n", x); 정수형으로출력 ( 잘못된결과 ) x : 3.000000 x : 0 23 4) 부동소수자료형 부동소수형의크기 float double long double 실제크기는시스템종류에따라다를수있음 VS2017 기준 자료형 메모리크기 값의범위 float 4 bytes 유효자릿수약 7개, 최대지수약 10 38 double 8 bytes 유효자릿수약 16개, 최대지수약 10 308 long double 8 bytes 유효자릿수약 16개, 최대지수약 10 308 24
4) 부동소수자료형 부동소수형의크기 유효자릿수확인 float x = 12345678901234567890.0; double y = 12345678901234567890.0; 20 자리수 20 자리수 printf("x : %f\n", x); printf("y : %f\n", y); float 형변수출력 double 형변수출력 x=12345679395506094080.000000 y=12345678901234567168.000000 25 목차 1) 변수와자료형개요 4) 부동소수자료형 6) 자료형변환 26
문자형 char, signed char, unsigned char 문자형자료형의크기는모두 1바이트 문자는작은따옴표 ' ' 를사용하여표현 출력 : printf의서식지정자 '%c' char ch = 'z'; 문자 'z' 로초기화 printf("ch: %c\n", ch); 문자형출력시 %c 사용 ch: z 27 문자형의실체 특정문자에해당하는정수값을지정 : 아스키 (ASCII) 코드 예 : 영어대문자 'A' 의아스키코드값은 65 문자형은본질적으로정수형과동일 char c1 = 'A'; char c2 = 65; 문자 'A' 로초기화 정수 65 로초기화 printf("c1: %c %d\n", c1, c1); printf("c2: %c %d\n", c2, c2); c1 의값 c2 의값 c1: A 65 c2: A 65 28
아스키코드표 : 외울필요없음 29 문자형은본질적으로정수 (1 바이트 ) 정수연산가능 char ch = 'A'+1; 66 즉, 문자 'B' 저장 부호없는자료형가능 : unsigned char 자료형메모리크기값의범위 char 1 bytes (8 bits) -128 ~ 127 unsigned char 1 bytes (8 bits) 0 ~ 255 30
문자 '0' 과숫자0은다르다 문자 '0' 의아스키코드값은 48 즉, 문자 '0' == 정수 48 char c1 = '0' ; char c2 = 0 ; 문자 '0' 으로초기화 정수 0 으로초기화 printf(" 문자 : %c %c\n", c1, c2); printf(" 정수 : %d %d\n", c1, c2); 문자 : 0 정수 :[ 빈칸 ] 31 특수문자 ( 이스케이프시퀀스 ) \ 과다음문자를묶어서하나의문자로간주 문자 역할 비고 \n 새로운줄로이동 [Enter] 키효과와동일 \t 다음탭으로이동 [Tab] 키효과와동일 \b 앞으로한칸이동 [Back Space] 키효과와동일 \r 줄의맨앞으로이동 [Home] 키효과와동일 \a 삑 소리를냄 \\ 역슬래쉬 \ \' 작은따옴표 ' \" 큰따옴표 " 32
목차 1) 변수와자료형개요 4) 부동소수자료형 6) 자료형변환 33 6) 자료형변환 서로다른자료형의값을대입하면? 정수는소수부분을표현할수없어 123.45가 123으로출력된점이외에는큰문제없이동작 int a = 123.45 ; double b = 123 ; 실수 123.45 대입 정수 123 대입 printf("a: %d\n", a); a의값출력 printf("b: %f\n", b); b의값출력 a: 123 b: 123.000000 34
6) 자료형변환 자동형변환 정수 부동소수 int a = 123.45; a 123 ( 정수 ) 123.45 ( 부동소수 ) 형변환 double b = 123; b 123.0 ( 부동소수 ) 123 ( 정수 ) 형변환 위변환과정은자동으로수행 : 자동형변환 ( 묵시적형변환 ) 35 6) 자료형변환 정보유실주의 double fnum1 = 13.5; double fnum2 = 12.5; int inum1 = fnum1; int inum2 = fnum2; inum1 에는 13 대입 inum2 에는 12 대입 printf("fnum1+fnum2 = %f \n", fnum1+fnum2); printf("inum1+inum2 = %d \n", inum1+inum2); fum1+fum2 = 26.000000 inum1+inum2 = 25 왜위와같은결과가나오는지생각해보자. 36
6) 자료형변환 명시적형변환 printf의서식지정자에따라형변환이자동으로발생하지않음 printf("12.3: %d\n", 12.3); printf("123: %f\n", 123); 12.3: 1717986918 123: 0.000000 명시적형변환필요 printf("12.3: %d\n", (int) 12.3); printf("123: %f\n", (double) 123); 12.3: 12 123: 123.000000 37