Download presentation
Presentation is loading. Please wait.
1
제 18 강 데이터 타입 타입, 변환, 캐스팅 shcho.pe.kr
2
타입이란? 메모리 공간을 정의 쓰임새 크기 정수형 char, int, short 부동소수점형 float, double 등등
3
쓰임새의 차이:int and float main(){ int i; i = 1; i = i + 1; } main(){
float i; i = 1; i = i + 1; }
4
Actual assembly code pushl %ebp movl %esp, %ebp subl $4, %esp
movl $0x3f800000, -4(%ebp) flds -4(%ebp) fld1 faddp %st, %st(1) fstps -4(%ebp) leave ret pushl %ebp movl %esp, %ebp subl $4, %esp movl $1, -4(%ebp) leal -4(%ebp), %eax incl (%eax) leave ret
5
다음 shcho.pe.kr
6
기본 데이터 타입 정수 계열: signed or unsigned 실수 계열: char short int int long int
float double long double
7
정수 계열 정수를 2진수 형태로 저장 문자의 저장에도 이용 char: 1byte, 문자에 주로 이용
short: 2byte, 크기가 작은 정수에 이용 long: 32 bit machine에서는 int와 같음 long long: 64bit int: 대개 4byte (16bit machine에서는 int=short)
8
주의 !!! char 는 character 타입이 아니라 짧은 정수형이다!!!!! char는 character에 많이 사용해서 그렇게 이름 붙인 것일 뿐 char, int, short, long 등은 길이만 다를 뿐, 모두 정수형임..
9
다음 shcho.pe.kr
10
Q18_01
11
수의 한계 1바이트(8bit)인 char의 경우: 2바이트인 short의 경우는? unsigned char는?
~ (0~127) ~ (-1~-128) 127 = 28-1, = -28 2바이트인 short의 경우는? unsigned char는?
12
“sizeof” 연산자 Not a function but an operator returns the size of a type or a variable in bytes e.g., sizeof(int) sizeof(char) 1 int x; sizeof(x) 4
13
다음 shcho.pe.kr
14
실습 lab18_01/size.c sizeof() 함수를 이용하여 long long, long, int, short, char, long double, double, float의 길이를 출력하라. 예시: “int는 4바이트, char는 ....” File 명: size.c
15
정수간의 복제 int i; char c; c = 1; i = c; int i; char c; i = 15; c = i;
16
다음 shcho.pe.kr
17
실습 lab18_02/shortchar.c short s와 char c를 선언하고 s에 257을 assign한 후에 s를 c에 복사 다시 c를 s에 복사 s 와 c 값을 출력한다. File 명: shortchar.c
18
Bits view short char
19
다음 shcho.pe.kr
20
실습 lab18_03/types.c 변수 i는 int로, c는 char로 선언한다. i = c = 129; i와 c 값을 출력
File: types.c
21
Quiz18_02 결과 물어보기
22
도전 여러 개의 정수를 적어두어야 하는데 키보드에서 '-' 키가 고장 났다. 금액을 적는 칸에는 숫자밖에는 넣을 수가 없다. 어떻게 적으면 나중에 기억을 할 수 있을까? (실제 게임을 해보자 – 팀별로?)
23
부호 없이 음수 표현하기 3자리 10진수를 생각하자. +/- 부호 없이 음수를 만들려면? 방법 하나.
001 부터 499 까지는 정상적인 양수로 하고 500부터 999까지는 음수라고 하자. 양수인지 음수인지는 첫째자리만 보면 안다(0~4 양수 5~9 음수) 1000 – 999 = 1 이므로 999는 –1로 정하자 1000 – 998 = 2 이므로 998은 –2로 약속하자 ... 1000 – 500 = 500 이므로 이것은 –500으로 하자.
24
만일에 길동이가 실수로 999를 실제 구백구십구라고 생각하고 써놓았다면 약속을 알고 있는 다른 사람들은 이 수를 얼마로 해석할까?
25
Decimal game Use Web game
26
2진수의 음수 나타내기 4자리 2진수 -100 나타내기 – 0100 = – 100 = = = 1100 -1 나타내기
27
Binary 음수 만들기 game Web
28
Sign Extension = 127 의 보수 의 보수 == -127 == -127
29
unsigned 경우 unsigned char == 129 10000001 unsigned short == 129
30
다음 shcho.pe.kr
31
실습 lab18_04 18_03 에서의 types.c를 수정하여 unsigned int와 unsigned char로 선언한다.
i = c = 129; i와 c 값을 출력 c = i = 129; i와 c 값을 출력 File: utypes.c, 18_04.txt report_18_04.txt 에는 lab18_03의 결과와의 차이를 기술하고 차이에 대한 이유를 설명해보라.
32
실수와 정수간 자동 변환 정수 실수: 실수 정수 : Assignment 이외의 연산 int i; float f=1.5;
i = f; truncation 1 실수 정수 : f=1; same as f = 1.0 Assignment 이외의 연산 5+2.5 9/5.0
33
다음 shcho.pe.kr
34
lab18_05/f_or_i.c #include <limits.h> // INT_MAX가 정의된 파일
i, j는 정수, f는 실수. 초기화 필요 while (i<INT_MAX){ i 값을 f에 넣었다가 f를 다시 j에 복사 만일 i와 j가 다르면 출력하고 프로그램 정지 i++; } 값이 달라지는 이유는 무엇이라고 생각되는가? 18_05.txt에 간략한 해답을 작성 goto 없이 끝내는 방법: return 0;
35
정수 상수의 타입 int i; ... i = 128; (129/5)+'a' + 1
long long int x = LL; 이 상수 자체는 int로 저장됨
36
lab18_06/ll.c/18_06.txt int x, y, z; x = y = 100; z = *y/x; printf("%d\n", z); z = LL*y/x; 위와 같은 코드를 실행하여 결과를 살펴보고 두 경우가 다르게 된 이유를 18_06.txt에 기술하여 제출하라.
37
실수 상수의 타입 double (8 byte)로 저장 0.8532 10.4 .3145 10.1e-15 -10.2e3
38
실수의 내부 표현 sign bit mantissa (유효 숫자): 2진수 exponent: 지수
*주의: 실제 비트열은 이와 다소 다름. 설명을 위하여 단순화하였음.
39
다음 shcho.pe.kr
40
실습 lab18_07: 실수의 한계 파일: f_limit.c float x = 1; while ( x 가 0보다 크다면 ) {
} x 값을 출력할 때는 %f와 %e 두 가지로 출력해본다.
41
실습 lab18_08: 실수의 한계 2 float 변수 두개를 선언한다. (x,y) x와 y에 1.0 값을 준다.
while을 이용하여 반복한다. 반복 조건은 "y 값과 y + x의 값이 다를 것"이다. 반복할 내용: x 값을 출력한다. x 값을 반으로 줄인다. while 문이 끝났다면 조건이 만족하지 않은 것이므로 x의 값을 출력한다. (%e format으로 출력) File 명: float.c 왜 x 값이 0이 아닌데도 불구하고 x + y가 y 값과 같은가? 18_08.txt
42
해설
43
Casting: 명시적 타입 변환 f = (9/5) * c + 32 ??
f = ((float)9 / (float)5) * c + 32 or f = (9.0/5.0) * c + 32 int sum, count; float average; … average = sum / count; // incorrect average = sum / (float)count; average = (float)sum/(float)count;
44
다음 shcho.pe.kr
45
실습 lab18_09/avg.c scanf를 이용하여 정수를 data에 읽어 들여서 정수 변수인 sum에 계속 더해나간다. 읽은 데이터의 총 개수는 num에 저장한다. (더이상 데이터 입력이 없을 때까지) 평균은 총합을 데이터 개수로 나눈 것이다. 이것을 average라는 double 변수에 저장하라. 주의 할 것은 소수점 이하도 계산되도록 하는 것이다. avg.c
46
제 18 강 끝. shcho.pe.kr
Similar presentations