C의 기본 구성 요소
자료형 불일치와 해결법
Chan-Su Shin
변환(conversion)과 캐스트(cast)
•
모든 상수, 변수, 수식은 유일한 자료형으로 정의되어야 한다– int a; double b; 3.2e+4, `c’, 4, 3.14+5
•
변환(conversion)은– 하나의 값을 다른 자료형에 배정할 때
int a = 3.5
– 서로 다른 자료형으로 구성된 수식을 계산할 때
int a = 4; double b = 5; float c;
c = a/b;
– 함수에 인자(parameter)를 넘겨줄 때
sin(3);
자동적으로 발생한다
배정에서의 변환
•
A = B;– A의 자료형과 B의 자료형이 다르고 A의 자료형이 B의 값을 저장할 수 있을 때 B의 값이 A의 자료형에 맞게 자동 변환되어 A에 저장된다
•
예제– float tree = 3; (int to float)
– int guess = 3.982; (float to int)
– int debt = 3.0E12; (undefined, system dependent)
•
문제– 자료의 손실 (float to int: 소수부분 없어짐, long long to int: 범위를 넘어서는 bit는 무시)
– 정밀도의 손실 (double to float)
배정에서의 변환
•
예제int i_value = 16777217;
float f_value = 16777216.0;
printf("The integer is: %d\n", i_value);
printf("The float is: %f\n", f_value);
printf("Their equality: %d\n", i_value == f_value);
수식에서의 변환
•
long double > double > float > unsigned long > long > unsigned int> int > unsigned short > short > char
A B A op B
long double N long double
double N double
float N float
unsigned long N unsigned long
long int unsigned int Depend on size
long int N long int
unsigned int N unsigned int
int N int
수식에서의 변환
• char a = 10, b = 20, c;
c = a + b;
printf(“a+b = %d\n”, c);
• 32비트 컴퓨터 시스템에선, 기본 연산(+, -, *, /)을 32비트 단위로 수행한다. 즉, 32비트 두 수의 기본 연산을 한번에 (단위시간에) 처리한다.
• 따라서 위의 두 char 변수의 덧셈을 위해선, CPU가 10과 20을 32비트 정수로 변환해서 덧셈하고, 다시 8비트 문자변수 c에 저장한다.
• 이를 특별히 정수승급: integral promotion이라 부른다. (char 또는 short 형)
• char a = 10;
int b = 20;
printf(“a + b = %d\n”, a + b);
• 수식에서의 변환이 발생!
예제
선언
char c; short s; int i; long l; unsigned u;
unsigned long ul; float f; double d; long double ld;
수식 형 수식 형
c – s / i u * 7 - i
u * 2.0 – i f * 7 – i
c + 3 7 * s * ul
c + 5.0 ld + c
d + s u – ul
2 * i / l u - l
int
double int
double double long
unsigned float
unsigned long long double unsigned long
system dependent
캐스트(cast)
•
강제로 자료형을 변환하는 것– 명시적으로 형을 변환하고자 할 때.
float a, d;
double b = 123456.90192, c = 1300495.09239;
a = b;
d = (float)c;
•
다음은 결과는?int a, b;
a = 19.99 + 11.99;
b = (int)19.99 + (int)11.99;
printf(“a = %d, b = %d\n”, a, b);
요약
•
부동형을 정수형으로– 소수부를 잃어버린다 계산결과를 예측할 수 없다.
•
큰 부동형 실수를 작은 부동형 실수로 (예: double float)– 정밀도(precision)가 손실될 수 있다. 결과를 예측할 수 없다.
•
큰 정수형을 작은 정수형으로 (예: long shor)– 값의 범위를 벗어날 경우 위쪽 비트는 무시된다. 결과를 예측할 수 없다.
연산자
Chan-Su Shin
연산자(operator)
산술 연산자
+ - * / % ++ --
7 % 5비교 연산자
< <= > >= == !=
if ( 3 == 4 ) then yes else no대입 연산자
= += -= *= /=
i = 5; j += i;논리 연산자
&& || ! ?:
if (you are human && I am human) then we are both human else who we are?
비트 연산자
& | ^ ~ << >>
000010010 & 100101110 = 000000010기타 연산자
( ) [ ] * &
sin( PI/4 ), A[5]연산자(계속)
•
산술 연산자– 단항 연산자 (unary operator)와 이항 연산자 (binary operator)
-6 + 7 * -2 = ?
– 우선순위(precedence)와 결합법칙(associative law)
1. + - (단항 연산자) 우에서 좌로 -+5 (-(+5))
2. * / % 좌에서 우로 3 * 2 / 4 ((3 * 2)/4) 3. + - (이항 연산자) 좌에서 우로 1 + 2 – 3 ((1 + 2) – 3)
•
예제1. -+5 - 7
2. 5 * 4 / 2 % 6 – 8 3. 7 + 2 * - 5 / + 3
연산자(계속)
•
비교 연산자 (연산의 결과는?)– A op B
> A is larger than B >= A is larger than or equal to B
< A is less than <= A is less than or equal to B
== A is equal to B != A is not equal to B
•
배정 연산자 (연산의 결과는?)– C에서는 = 자체가 하나의 이항연산자로 정의된다.
A = (B = 2) + (C = 3 + 5);
– A op= B (op: 산술 이항 연산자, 논리 연산자)
A = A op (B);
A = B;
A += B; A = A + B;
A *= B + C; A = A * (B+C);
B = 2;
C = 3 + 5;
A = B + C;
연산자(계속)
•
증가, 감소 연산자– ++A - - B 전위(prefix) 증감 연산자 change-then-use – A++ B- - 후위(postfix) 증감 연산자 use-then-change
– 상수나 수식에는 적용할 수 없고, 언제나 숫자 변수에만 적용할 수 있다.
•
예제int A = 0, B = 0, C = 0;
C++; // C = C + 1; 과 같은 문장 A = ++C ;
B = C++;
printf(“ %d %d %d\n”, A, B, C);
int A = 10, B = 10;
printf(“ %d \n”, ++A);
printf(“ %d\n”, B++);
연산자(계속)
순위 연산자 결합법칙
1 ( ) ++(후위) -- (후위) 좌에서 우로
2 +(단항) -(단항) ++(전위) --(전위) 우에서 좌로
3 * / % 좌에서 우로
4 + - 좌에서 우로
5 = += -= *= /= … 우에서 좌로
연산자(계속)
•
예제 (실습시간 숙제)•
한 수식 내에서 한 변수에 대한 증감 연산자는 한 번만 사용할 것•
가능하면 ( )로 묶어 모호한 경우를 사전에 피할 것int A = 2;
printf(“ %d ”, 5 * A++);
printf(“ %d ”, 5 * ++A);
int A = 2, B = 3, C = 1, D = 4;
A *= B = C + D++;
printf(“ %d \n”, A);
int A = 2;
(++A)++;
printf(“ %d \n”, A);
int A = 2;
A = 2 * A++ * (3 - ++A);
printf(“ %d \n”, A);
A = A++ + A++;
printf(“%d\n”, A);