implicit conversion / explicit conversion

킴스코딩클럽·2022년 9월 20일
1

CS기초 시리즈

목록 보기
10/71

타입변환의 원칙은 정보 손실을 최소화 하는 방향으로 수행함 정보 손실은 저장 공간이 큰 값에서 작은 값으로 변환될 때 발생되지만 저장 공간의 크기가 같은 경우에도 일어남


implicit conversion

실수(float/double)형에서 정수(int)형으로 변환 시

5/2 >> 결과는 2 정수와 정수의 연산은 결과도 정수
5/2.0 >> 결과는 2.5 정수형과 double형에서 정보 손실을 없애려면 5double형으로 간주 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.5fint형으로 의도적으로 변환

사용법
(자료형)(int) 1.5f
(자료형) () (int) (1.5f)
자료형 () int (1.5f)

int{1,5f} 
//유니폼 초기화를 사용한 명시적 변환은 불가

static_cast<int>(int1.5f) 
// 정적변환(static cast) :나중에 공부

정리

implicit conversion

  • 컴파일러가 허용하는 형변환 프로그래머의 작업 필요 없이 자동적으로
  • 크키가 작은 것에서 큰 것으로의 변환은 대부분 허용됨

explicit conversion

  • 프로그래머가 직접 지정하는 형변환 (type cast)
  • 변환하려는 형식 앞에 (형식)을 붙여 명시적으로 알려줌
  • 큰 크기에서 작은 크기의 형식으로 변환 시 저장공간의 크기 때문에 값이 잘려 나감
  • 명시적으로 표기해도 불가능한 경우도 있다

실제 형변환 사례

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)은 삭제됨

profile
공부 기록용

0개의 댓글