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

정수와 실수를 함께 연산하면 결괏값은 실수로 나옵니다. 왜냐하면 실수가 정수보다 표현 범위가 넓기 때문입니다.

그림 16‑1 표현 범위가 넓은 쪽으로 자동 변환

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 longnum1intnum2를 함께 연산하면 long long으로 변환됩니다. int는 4바이트, long long은 8바이트이므로 int보다 long long이 크기 때문이죠.