#include<stdio.h>intmain(){intnum1=11;floatnum2=4.4f;printf("%f\n",num1+num2);// 정수와 실수 덧셈. 정수는 실수로 변환됨printf("%f\n",num1-num2);// 정수와 실수 뺄셈. 정수는 실수로 변환됨printf("%f\n",num1*num2);// 정수와 실수 곱셈. 정수는 실수로 변환됨printf("%f\n",num1/num2);// 정수와 실수 나눗셈. 정수는 실수로 변환됨return0;}// 15.400000// 6.600000// 48.400002// 2.500000
정수와 실수를 함께 연산하면 결괏값은 실수로 나온다.
왜냐하면 실수가 정수보다 표현 범위가 넓기 때문이다.
C에서는 자료형을 섞어서 쓰면 컴파일러에서 암시적 형 변환을 하게 되는데 자료형의 크기가 큰 쪽, 표현 범위가 넓은 쪽으로 자동 변환된다.
이를 형 확장이라고 하며 값이 버려지지 않고 그대로 보전된다.
이번에는 크기가 다른 정수끼리 연산을 해보자.
#include<stdio.h>intmain(){longlongnum1=123456789000;intnum2=10;// int 타입보다 long long 타입이 자료형 크기가 크므로 long long 타입으로 변환됨printf("%lld\n",num1+num2);// 123456789010printf("%lld\n",num1-num2);// 123456788990printf("%lld\n",num1*num2);// 1234567890000printf("%lld\n",num1/num2);// 12345678900return0;}
long long 타입 num1과 int 타입 num2를 함께 연산하면 long long 타입으로 변환된다.
int 타입은 4바이트, long long 타입은 8바이트이므로 int 타입보다 long long 타입이 크기 때문이다.
3. 자료형의 축소 알아보기
다음과 같이 실수에서 정수로 표현 범위가 좁은 쪽으로 변환하게 되면 값의 손실이 생긴다.
#include<stdio.h>intmain(){floatnum1=11.0f;floatnum2=5.0f;// 실수에서 실수를 나누어 2.2가 나왔지만// 정수 자료형에는 2만 저장되고 0.2는 버려짐intnum3=num1/num2;printf("%d\n",num3);// 2return0;}
11.0에서 5.0을 나누면 2.2가 되어야 하지만 정수 자료형에서는 소수점 이하 자리를 표현할 수 없으므로 2만 저장된다.
따라서 0.2가 버려지게 되므로 주의한다.
이렇게 자료형의 크기가 작은 쪽, 표현 범위가 좁은 쪽으로 변환되는 것을 형 축소라고 한다.
형 축소가 일어나면 컴파일할 때 값의 손실이 일어날 수 있다고 경고가 나온다.
컴파일 경고가 나오지 않게 하려면 형 변환을 해야 한다.
이번에는 크기가 다른 정수끼리 연산을 해보자.
#include<stdio.h>intmain(){charnum1=28;intnum2=1000000002;// char 타입보다 큰 숫자는 저장할 수 없음// 28 + 2만 남고 앞 자릿수는 버려짐charnum3=num1+num2;printf("%d\n",num3);// 30return0;}
문자 자료형 char 타입도 정수 자료형이므로 int 타입과 함께 연산해도 문제가 없다.
하지만 char 타입과 int 타입을 함께 연산한 뒤 char 타입에 저장하면 char 타입보다 큰 숫자는 저장할 수 없다.