Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C/C++ 형 변환(Type Casting) 완벽 정리: 캐스트 연산자부터 정수 승격까지

형 변환(Type Casting)이란?

형 변환(Type Casting)은 변수를 한 데이터 타입에서 다른 데이터 타입으로 변환하는 방법입니다. 예를 들어, long 값을 일반 int 변수에 저장하고 싶다면 longint로 형 변환하면 됩니다.

C/C++에서는 캐스트 연산자(cast operator)를 사용해 값을 명시적으로 다른 타입으로 변환할 수 있으며, 기본 문법은 다음과 같습니다.

(type_name) expression

캐스트 연산자 예제

다음 예제는 캐스트 연산자를 사용해 정수 나눗셈을 부동소수점 연산으로 수행하는 경우입니다.

#include <stdio.h>
main() {
    int sum = 17, count = 5;
    double mean;
    mean = (double) sum / count;
    printf("Value of mean : %f\n", mean );
}

위 코드를 컴파일하고 실행하면 다음과 같은 결과가 출력됩니다.

Value of mean : 3.400000

여기서 주목할 점은 캐스트 연산자가 나눗셈 연산보다 우선순위가 높다는 것입니다. 따라서 sum의 값이 먼저 double 타입으로 변환된 후 count로 나뉘며, 최종 결과는 double 값이 됩니다. 만약 캐스트 연산자가 없었다면 정수 나눗셈이 수행되어 결과는 3이 되었을 것입니다.

형 변환은 컴파일러가 자동으로 수행하는 암시적(implicit) 변환과, 프로그래머가 캐스트 연산자를 통해 지정하는 명시적(explicit) 변환 두 가지로 나눌 수 있습니다. 일반적으로 형 변환이 필요한 상황에서는 캐스트 연산자를 명시적으로 사용하는 것이 좋은 프로그래밍 습관으로 여겨집니다. 이는 코드의 의도를 명확히 하고, 예상치 못한 자동 변환으로 인한 버그를 방지하는 데 도움이 됩니다.

정수 승격(Integer Promotion)

정수 승격(Integer Promotion)은 int 또는 unsigned int보다 "작은" 정수 타입의 값을 int 또는 unsigned int로 변환하는 과정입니다. C 언어에서는 표현식을 평가할 때 이러한 승격이 자동으로 일어납니다.

다음은 문자와 정수를 더하는 예제입니다.

#include <stdio.h>
main() {
    int i = 17;
    char c = 'c'; /* ascii 값은 99 */
    int sum;
    sum = i + c;
    printf("Value of sum : %d\n", sum );
}

위 코드를 컴파일하고 실행하면 다음과 같은 결과가 출력됩니다.

Value of sum : 116

여기서 sum의 값이 116이 되는 이유는, 컴파일러가 실제 덧셈 연산을 수행하기 전에 정수 승격을 통해 문자 'c'의 값을 ASCII 코드 값인 99로 변환하기 때문입니다. 즉, 17 + 99 = 116이 계산되는 것입니다.

일반 산술 변환(Usual Arithmetic Conversion)

일반 산술 변환(usual arithmetic conversions)은 서로 다른 타입의 피연산자들을 공통 타입으로 맞추기 위해 암시적으로 수행됩니다. 컴파일러는 먼저 정수 승격을 수행하고, 그 후에도 피연산자들의 타입이 서로 다르면 다음 계층 구조에서 더 위에 있는 타입으로 변환합니다.

C/C++ 형 변환(Type Casting) 완벽 정리: 캐스트 연산자부터 정수 승격까지

계층 구조는 일반적으로 long doubledoublefloatunsigned long longlong longunsigned longlongunsigned intint 순으로, 더 큰 표현 범위를 가진 타입이 우선됩니다.

단, 일반 산술 변환은 대입 연산자(=)나 논리 연산자(&&, ||)에는 적용되지 않습니다. 다음 예제를 통해 이 개념을 살펴보겠습니다.

예제

#include <stdio.h>
main() {
    int i = 17;
    char c = 'c'; /* ascii 값은 99 */
    float sum;
    sum = i + c;
    printf("Value of sum : %f\n", sum );
}

실행 결과

Value of sum : 116.000000

여기서는 먼저 문자 c가 정수로 변환되어 덧셈이 수행되는 것까지는 앞선 예제와 같습니다. 하지만 최종 저장 대상인 변수 sumfloat 타입이므로, 일반 산술 변환에 따라 컴파일러가 icfloat 타입으로 변환하여 더하고, 그 결과로 float 값 116.000000이 출력되는 것입니다.

마무리

형 변환은 C/C++ 프로그래밍에서 매우 중요한 개념입니다. 캐스트 연산자를 활용한 명시적 변환, 컴파일러에 의한 정수 승격, 그리고 일반 산술 변환 규칙을 정확히 이해하면 연산 결과의 타입을 예측할 수 있고, 데이터 손실이나 오버플로 같은 잠재적인 오류를 사전에 방지할 수 있습니다.