C언어 변수 & 연산자 자료형 변환

    2018-02-06 13:15:26 작성

    자료형의 형변환은 데이터의 표현방식을 바꾸는 것입니다. 자료형의 형변환은 크게 두종류로 나눌 수 있습니다.

    • 자동 형 변환 (묵시적 형 변환)
    • 강제 형 변환 (명시적 형 변환)

    대입연산의 전달 과정에서 발생하는 자동 형 변환

    #include <stdio.h>
    
    int main(void) {
        double a = 123; // int(정수:4byte) -> double(실수:8byte)로 자동 형 변환
        int b = 3.14; // double(실수:8byte) -> int(정수:4byte)로 자동 형 변환
        char c = 129; // int(정수:4byte) -> char(정수:1byte)로 자동 형 변환
    
        printf("정수 123을 실수로 %f \n", a);
        printf("실수 3.14를 정수로 %d \n", b);
        printf("큰정수(int) 129를 작은정수(char)로 %d \n", c);
        return 0;
    }
    • double a = 123; : 정수를 실수로 변환하는 경우는 실수의 표현범위가 정수에 비해 넓기 때문에 데이터의 손실을 일어나지 않습니다.
    • int b = 3.14 : 실수를 정수로 변환하는 경우는 소수점 이하의 값은 버려집니다.
    • char c = 129 : 큰정수 int(4byte)에서 작은정수 char(1byte)로 변환하는 경우 정수의 바이트 크기에 마춰서 상위 바이트는 단순히 소멸됩니다.
      그로 인해 부호가 바뀔 수도 있으니 주의가 필요합니다.


    정수의 승격에 의한 자동 형 변환

    일반적으로 CPU가 처리하기에 적합한 크기의 정수를 int로 정의합니다.(16bit에서 2바이트, 32bit에서 4바이트)
    따라서 int형 정수가 다른 정수 자료형 보다 연산속도가 동일하거나 더 빠릅니다.

    #include <stdio.h>
    
    int main(void) {
        short a = 10;
        short b = 20;
        short c = a + b; // a와 b가 int형으로 형 변환
        printf("c = %d", c);
        return 0;
    }

    이러한 형태의 형변환을 '정수의 승격' 이라고 합니다.
    6행에서 보면 a 와 b 만 자동 형 변환이 일어난게 아닙니다.
    a + b의 값 또한 4바이트 int 형이기 때문에 c값으로 대입되면서(먼저 설명했던 대입연산의 전달) short로 형변환이 다시 일어납니다.



    피연산자의 자료형 불일치로 인한 자동 형 변환

    일반적으로 사칙연산과 같은 산술연산자는 2개의 피연산자가 필요합니다.(2항연산자)
    두개의 피연산자의 자료형은 일치해야 하며, 만약에 일치 하지 않을 경우 자료형의 목적으로 자동 형변환이 일어납니다.

    #include <stdio.h>
    
    int main(void) {
        int a = 10;
        double b = 4.51;
        double c = a + b; //a는 double형으로 형변환
        printf("c = %f\n", c);
        return 0;
    }

    6행에서 보면 a는 int(4byte) b는 double(8byte)이기 때문에 데이터 손실이 최소화 할 수 있는 형태로 자료형의 형변환이 일어나게 됩니다.
    따라서, 피연산자의 자료형이 일치 하지 않아 발생하는 자료형의 형변환은 데이터 손실을 최소화 하는 방향으로 진행되며,
    형변환의 우선순위는 정수자료형 보다 실수자료형이 무조건 앞서는 형태로 되어있습니다.



    강제로 일으키는 형변환 (명시적 형 변환)

    연산자에서 cast연산 이라는것을 잠깐 언급했었습니다.
    명시적 형 변환 이란 형변환 연산자를 이용하여 강제로 형변환을 명령하는 것입니다.

    #include <stdio.h>
    
    int main(void) {
        int a = 3, b = 4;
        double c = a / b;
        double z = a / (double)b;
    
        printf("c = %f\n", c);
        printf("z = %f\n", z);
        return 0;
    }


    5행은 int / int 로 그 반환이 int이기 때문에 10행에서 출력시 0.000000 이 출력이 됨을 알 수 있고,
    8행의 경우 int형 변수인 y에 (double) 이렇게 형변환 연산자를 붙여 주어 강제로 형변환을 한 경우 입니다.
    8행은 이렇게 표현될 수 있습니다.

    double z = 3 / 4.0

    x의 경우 먼저 배운 피연산자의 불일치로 인한 자동 형변환이 됨으로 다음과 같이 표현이 됩니다.

    double z = 3.0 / 4.0

    double / double 이 되기 때문에 z는 0.75 라는 값이 출력되는것을 알 수 있습니다.

    이렇듯 자료형앞에 (변환할 자료형) 과 같은 형태로 표현되는 것을 cast 또는 casting 이라고 하며 명시적 형변환 연산자라고 합니다.