타입변환의 원칙은 정보 손실을 최소화 하는 방향으로 수행함 정보 손실은 저장 공간이 큰 값에서 작은 값으로 변환될 때 발생되지만 저장 공간의 크기가 같은 경우에도 일어남
implicit conversion
실수(float/double)형에서 정수(int)형으로 변환 시
5/2 >> 결과는 2 정수와 정수의 연산은 결과도 정수
5/2.0 >> 결과는 2.5 정수형과 double형에서 정보 손실을 없애려면 5를 double형으로 간주 double{5}/2.0d으로 계산됨
5/2.0f >> 결과는 2.5 정수와 float(부동소수점)에서는 동일한 크기를 가지지만 소수점이하 손실을 줄여야함
float{5} / 2.0f으로 처리함
'a' + 1 >> 결과는 98 문자 a를 int형으로 전환(ascii code 사용) 97 + 1
이런 식으로 컴파일러가 자동적으로 타입변환을 하는 것을 암시적변환이라고 함 결과가 프로그래머의 의도와 다르게 나올 수 있음 이를 방지하기 위해서 프로그래머가 수행하는 의도적인 형태변환을 사용할 필요가 있음
explicit conversion
int(1.5f) >>결과 1 : 피연산자인 1.5f를 int형으로 의도적으로 변환
사용법
(자료형) 값 (int) 1.5f
(자료형) (값) (int) (1.5f)
자료형 (값) int (1.5f)
int{1,5f}
//유니폼 초기화를 사용한 명시적 변환은 불가
static_cast<int>(int1.5f)
// 정적변환(static cast) :나중에 공부
정리
implicit conversion
explicit conversion
실제 형변환 사례
a부터 z까지 순서대로 입력해보자
for (int i = 97; i <= 122; i++)
{
std::cout << char(i) << std::endl;
}
for (char i = 97; i <= 122; i++)
{
std::cout << i << std::endl;
}
for (char i = 'a'; i <='z'; i++)
{
std::cout << i << std::endl;
}
int main()
{
// 몫과 나머지를 구하시오.
int x = 3;
int y = 2;
x/y ; >> 몫
x%y ; >>나머지
}
명시적 형변환으로 인한 값 손상
int exConvInt = 500;
unsigned char exConvCharacter = exConvInt;
std::cout << exConvInt << std::endl;
// 결과값: 500
std::cout << int(exConvCharacter) << std::endl;
// 결과값 : 244
긱긱을 2진수 표현해보면
500 = 000111110100
244 = 11110100
unsigned char는 8비트로 8자리만 사용가능 따라서 오른쪽부터 8자리까지만 저장되고 나머지(0001)은 삭제됨