16 자료형의 확장과 축소 알아보기
지금까지 정수, 실수, 문자 자료형끼리만 연산을 해보았습니다. 하지만 실제로 프로그래밍을 할 때는 서로 다른 자료형으로 연산을 할 때가 많습니다.
이번 유닛에서는 서로 다른 자료형끼리 연산을 하면 어떤 현상이 발생하는지 알아보겠습니다.
16.1 자료형의 확장 알아보기
먼저 정수와 실수를 함께 연산했을 때의 자료형의 확장을 알아보겠습니다. 다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.
type_promotion_int_to_float.c
#include <stdio.h> int main() { int num1 = 11; float num2 = 4.4f; printf("%f\n", num1 + num2); // 15.400000: 정수와 실수 덧셈. 정수는 실수로 변환됨 printf("%f\n", num1 - num2); // 6.600000: 정수와 실수 뺄셈. 정수는 실수로 변환됨 printf("%f\n", num1 * num2); // 48.400002: 정수와 실수 곱셈. 정수는 실수로 변환됨 printf("%f\n", num1 / num2); // 2.500000: 정수와 실수 나눗셈. 정수는 실수로 변환됨 return 0; }
실행 결과
15.400000 6.600000 48.400002 2.500000
정수와 실수를 함께 연산하면 결괏값은 실수로 나옵니다. 왜냐하면 실수가 정수보다 표현 범위가 넓기 때문입니다.
C 언어에서는 자료형을 섞어서 쓰면 컴파일러에서 암시적 형 변환(implicit type conversion)을 하게 되는데 자료형의 크기가 큰 쪽, 표현 범위가 넓은 쪽으로 자동 변환됩니다. 이를 형 확장(type promotion)이라고 하며 값이 버려지지 않고 그대로 보전됩니다.
이번에는 크기가 다른 정수끼리 연산을 해보겠습니다.
type_promotion_int_to_long_long.c
#include <stdio.h> int main() { long long num1 = 123456789000; int num2 = 10; // int보다 long long이 자료형 크기가 크므로 long long으로 변환됨 printf("%lld\n", num1 + num2); // 123456789010 printf("%lld\n", num1 - num2); // 123456788990 printf("%lld\n", num1 * num2); // 1234567890000 printf("%lld\n", num1 / num2); // 12345678900 return 0; }
실행 결과
123456789010 123456788990 1234567890000 12345678900
long long형 num1과 int형 num2를 함께 연산하면 long long으로 변환됩니다. int는 4바이트, long long은 8바이트이므로 int보다 long long이 크기 때문이죠.