자료형의 변환이란 데이터의 표현방식을 바꾸는 

즉, int형을 double형으로, char형을 int형으로 바꿀있다.

 

1. 자동 형 변환 (암시적 형 변환)

2. 강제 형 변환 (명시적 형 변환)

 


 

자동 형변환 (암시적 형변환)

데이터 형식(Type)을 자동으로 변환해 주는 것을 의미

대입 연산자를 기준으로 오른쪽에서 왼쪽으로 자동 형 변환된다.

 

 

 > 정수를 실수로 형 변환

정수에 해당하는 값을 실수로 표현하게 되면 실수의 표현범위가 정수에 비해 훨씬 넓기에 데이터 손실은 일어나지 않는다.

다만, 실수의 표현이기 때문에 오차는 존재한다.

double num1 = 10; //int형 정수 10을 double형으로 자동 형 변환

 

int형 정수인 10double형 실수 10.0으로 형 변환되어 num1에 저장된다.

 

 

> 실수를 정수로 형 변환

정수는 소수점 이하 값을 표현하지 못하기에 소수점 이하 값은 버려진다.

int num2 = 3.1415; // double형 실수 3.1415를 int형 정수 3으로 자동 형 변환

int형은 소수점 이하의 값을 표현할 수 없으므로, 형 변환에서 3.1415가 정수 3으로 변환되어 num2에 저장된다.

실수형 데이터를 정수형 데이터로 변환하는 과정에서는 '소수 부분의 손실'이 발생한다.

 

 

 > 바이트 크기가 큰 정수를 바이트 크기가 작은 정수로 형 변환 

 변환하고자 하는 정수의 바이트 크기에 맞춰 상위 바이트를 단순 소멸 시키며, 이로 인해 부호가 바뀔 수 있다.

int num3 = 56828;
char ch = num3; //int형 변수 num3에 저장된 값이 char형으로 자동 형 변환

56,828이 저장된 변수 num3의 비트는

00000000 00000000 11011101 11111100

 

이를 변수 ch에 저장하기 위해서는 1바이트 크기로 줄여야 한다.

즉, 이 경우 '상위 바이트의 손실'이 발생하며 다음과 같이 도출된다.

11111100 

 

 

> 정수의 승격에 의한 자동 형 변환 (정수의 연산 시 발생하는 경우)

일반적으로 CPU가 처리하기에 가장 적합한 크기의 정수 자료형은 int형이다.

int형보다 작은 크기의 정수형 데이터는 int형 데이터로 자동 형변환 되어서 연산이 진행된다.

#include <iostream>
using namespace std;

int main ()
{
	short num1 = 10;
    short num2 = 20;
    cout << sizeof(num1+num2) << endl;
}

sizeof(num1 + num2)를 출력해 보면 4가 나온다. 즉, 연산이 진행될 때 short형이 int형으로 형변환이 이루어진다.

 

 

> 피연산자의 자료형 불일치로 발생하는 자동 형 변환(수식의 연산 시 발생하는 경)

기본적인 산술연산에는 두 개의 피연산자가 필요하다. 이 둘의 자료형은 일치해야 하며, 만약 일치하지 않을 경우

자료형의 일치를 목적으로 자동 형변환이 일어난다.

double num = 3.14 + 10;
cout << num << endl;

변수 num은 실수형 데이터인 3.14와 정수형 데이터인 10을 더하는 연산이다.

하지만 같은 자료형의 두 피연산자를 대상으로만 연산이 가능하도록 설계되어 있어 정수와 실수는 원래 덧셈이 불가능하다.

그렇기에 두 개의 자료형 중 하나를 변환시켜줘야 한다.

실수를 정수로 변환하면 소수점 이하 부분의 데이터 손실이 발생하기에 정수를 실수로 변환하여 손실을 없애도록 int타입을 double 타입으로 변환시킨다.

즉, 데이터 손실을 최소화하기 위해 자동 형변환이 이루어지는데 이때 이루어지는 형 변환의 상대적 우선순위는

char < int < long < float < double < long double (오른쪽으로 갈수록 높은 우선순위)

 


 

강제 형 변환 (명시적 형 변환)

형 변환 연산자를 이용해서 상제로 형 변환을 명령하는 것

int num1 = 4;
int num2 = 5;

double divResult;
divResult = num1 / num2;
cout << "결과 : " << divResult << endl;

위 식은 피연산자의 자료형이 일치하기 때문에 결과는 0이 된다. 그 0의 값이 double형에 자동 형 변환되어 변수 divResult에 저장된다.

divResult 변수에 0.8이라는 결괏값을 나오게 하기 위해선 num1 또는 num2double형으로 명시적 형 변환을 해주어야 한다.

int num1 = 4;
int num2 = 5;

double divResult;
divResult = (double)num1 / num2;
cout << "결과 : " << divResult << endl;

num1을 명시적 형변환으로 double형으로 바꾸었기에 결괏값은 0.8이 된다.

num1double형, num2 int형으로 데이터 손실을 줄이기 위해 int형인 num2double형으로 자동 형 변환하여 divResult 변수에 저장된다.

 

'C++' 카테고리의 다른 글

Call by value, Call by reference, 참조자  (0) 2023.03.16
아스키코드  (0) 2023.03.11
C++ 바이트 패딩(Byte Padding)  (0) 2023.03.11
C++ 연산자 우선 순위  (0) 2023.03.02
컴파일 정리 과정  (0) 2023.02.27

+ Recent posts