Skip to content

11. 자료형의 확장과 축소


1. 키워드

  • 암시적 형 변환(Implicit Type Conversion)
  • 형 확장(Type Promotion)과 형 축소(Type Demotion)
  • 형 변환(Type Casting)


2. 자료형의 확장 알아보기

  • 먼저 정수와 실수를 함께 연산했을 때의 자료형의 확장을 알아보자.


#include <stdio.h>

int main()
{
    int num1 = 11;
    float num2 = 4.4f;

    printf("%f\n", num1 + num2); // 정수와 실수 덧셈. 정수는 실수로 변환됨
    printf("%f\n", num1 - num2); // 정수와 실수 뺄셈. 정수는 실수로 변환됨
    printf("%f\n", num1 * num2); // 정수와 실수 곱셈. 정수는 실수로 변환됨
    printf("%f\n", num1 / num2); // 정수와 실수 나눗셈. 정수는 실수로 변환됨

    return 0;
}

// 15.400000
// 6.600000
// 48.400002
// 2.500000


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


001


  • 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;
}


  • long long 타입 num1int 타입 num2를 함께 연산하면 long long 타입으로 변환된다.
  • int 타입은 4바이트, long long 타입은 8바이트이므로 int 타입보다 long long 타입이 크기 때문이다.


3. 자료형의 축소 알아보기

  • 다음과 같이 실수에서 정수로 표현 범위가 좁은 쪽으로 변환하게 되면 값의 손실이 생긴다.


#include <stdio.h>

int main()
{
    float num1 = 11.0f;
    float num2 = 5.0f;

    // 실수에서 실수를 나누어 2.2가 나왔지만
    // 정수 자료형에는 2만 저장되고 0.2는 버려짐
    int num3 = num1 / num2;

    printf("%d\n", num3); // 2

    return 0;
}


  • 11.0에서 5.0을 나누면 2.2가 되어야 하지만 정수 자료형에서는 소수점 이하 자리를 표현할 수 없으므로 2만 저장된다.
  • 따라서 0.2가 버려지게 되므로 주의한다.
  • 이렇게 자료형의 크기가 작은 쪽, 표현 범위가 좁은 쪽으로 변환되는 것을 형 축소라고 한다.
  • 형 축소가 일어나면 컴파일할 때 값의 손실이 일어날 수 있다고 경고가 나온다.
  • 컴파일 경고가 나오지 않게 하려면 형 변환을 해야 한다.


  • 이번에는 크기가 다른 정수끼리 연산을 해보자.


#include <stdio.h>

int main()
{
    char num1 = 28;
    int num2 = 1000000002;

    // char 타입보다 큰 숫자는 저장할 수 없음
    // 28 + 2만 남고 앞 자릿수는 버려짐
    char num3 = num1 + num2;

    printf("%d\n", num3); // 30

    return 0;
}


  • 문자 자료형 char 타입도 정수 자료형이므로 int 타입과 함께 연산해도 문제가 없다.
  • 하지만 char 타입과 int 타입을 함께 연산한 뒤 char 타입에 저장하면 char 타입보다 큰 숫자는 저장할 수 없다.
  • 여기서는 28 + 1000000002에서 28 + 2만 남게 되고 앞 자릿수는 버려진다.


002


  • 버려지는 자릿수를 정확하게 표현하기 위해 2진수로 변환했다.


  • 지금까지 알아본 형 확장과 축소를 그림으로 나타내면 다음과 같다.


003


  • 오른쪽으로 갈수록 크기가 크고 표현 범위가 넓은 자료형이다.
  • 그리고 같은 자료형 안에서도 숫자가 높을수록 크기가 크다.

References