C++에서 데이터 유형을 변환하는 방법

C Eseo Deiteo Yuhyeong Eul Byeonhwanhaneun Bangbeob



한 변수의 데이터 유형을 다른 변수로 변경하는 프로세스를 C++에서는 유형 변환 또는 유형 캐스팅이라고 합니다. 이는 데이터 유형이 서로 호환되도록 만들어 다양한 데이터 유형의 변수에 대한 수학적 연산을 수행하기 위해 수행됩니다. 유형 변환은 코드를 최적화합니다. 예를 들어, 두 변수의 차이를 계산할 때 한 숫자는 float 유형이고 다른 숫자는 정수 데이터 유형인 경우 정수 데이터 유형을 float 유형으로 변환하여 뺄셈을 수행합니다.

C++에서 데이터 유형을 변환하는 방법

C++에서는 데이터 유형을 변경하는 두 가지 방법이 있습니다.

암시적 유형 변환

C++ 코드 컴파일러가 미리 정의한 규칙에 따라 암시적 유형 변환은 사용자의 외부 트리거 요구 사항 없이 컴파일러가 자동으로 수행하는 유형 변환입니다. 이러한 유형의 변환은 일반적으로 둘 이상의 데이터 유형이 있고 표현식의 데이터 유형이 이 표현식에 포함된 변수의 데이터 유형과 일치하지 않는 경우 프로그램에서 발생합니다.







변환 중 데이터 손실을 방지하기 위해 컴파일러는 기본적으로 정밀도가 낮은 데이터 유형을 정밀도가 더 높은 데이터 유형으로 변경합니다. 예를 들어, 데이터 손실을 방지하기 위해 부동 소수점을 정수로 변경하는 대신 정수를 부동 소수점으로 변환합니다. 이것을 프로모션이라고 합니다. 다음은 다양한 데이터 유형에 대한 우선순위 다이어그램입니다.





유형 변환 순서

유형 변환의 올바른 순서는 다음과 같습니다.





부울 -- > 문자 -- > 짧은 정수 -- > 정수 -- > 부호 없는 정수 -- > 긴 -- > 부호 없는 긴 -- > 오래 오래 -- > 뜨다 -- > 더블 -- > 긴 더블

데이터 손실을 방지하기 위해 낮은 정밀도 유형의 변수를 높은 정밀도 데이터 유형으로 변환합니다.

실시예 1

이 예에서는 암시적 유형 변환을 사용하여 서로 다른 데이터 유형의 변수에 대한 추가가 수행됩니다.



#include
사용하여 네임스페이스 성병 ;

정수 기본 ( ) {
정수 숫자 = 100 ;
성격 = '씨' ;
시합 << '100 + 'C' = ' << 숫자 + 성격 << ;

뜨다 = 숫자 + '씨' ;
시합 << 'float val(100 + 'c') = ' << << ;

정수 ~였다 = 7890 ;
아니였다 = ~였다 ;
시합 << 'var_int = ' << 아니였다 ;
반품 0 ;
}

여기에는 ASCII 테이블의 정수와 문자, 부동 소수점 숫자와 문자 'c'가 추가됩니다. 정수는 세 번째 세그먼트에 긴 데이터 유형으로 유지되며 데이터 유형은 미리 정의된 규칙에 따라 컴파일러 자체에서 변경됩니다.

100과 'C'의 합은 167을 반환합니다. 'C'는 숫자로 67에 해당하고 100+'c'는 소문자 'c'가 99에 해당하므로 199를 반환합니다. int 변수는 long 데이터 형식으로 저장됩니다.

실시예 2

이 예에서는 문자 D가 부동 소수점으로 변환되어 나누기 연산을 수행합니다.

#include
사용하여 네임스페이스 성병 ;

정수 기본 ( ) {
엑스 = '디' ;

뜨다 float_var ;

float_var = 뜨다 ( 엑스 ) / '씨' ;
// 명시적으로 int를 float로 변환합니다.

시합 << 'float_var의 값은 다음과 같습니다: ' << float_var << ;

반품 0 ;
}

입력 값은 문자 D 형식으로 float 데이터 형식으로 저장되고 문자 C로 더 나뉩니다. 이러한 문자는 숫자 값으로 변경되고 나눗셈 연산이 수행되어 해당 값이 float로 반환됩니다.

명시적 유형 변환

사용자는 종종 유형 캐스팅이라고 알려진 C++의 명시적 유형 변환을 사용하여 데이터 유형을 수동으로 변경해야 합니다. 이러한 유형의 캐스팅은 암시적 유형 변환을 피하기 위해 수행됩니다. C++에서 명시적 유형 캐스팅을 수행하는 방법에는 두 가지가 있습니다.

  • 할당 연산자를 사용한 변환
  • Cast 연산자를 사용한 변환

C++에서 할당 연산자를 사용한 유형 변환

할당 연산자를 사용한 유형 변환은 강제로 수행됩니다. 즉, 한 데이터 유형이 다른 데이터 유형으로 수동으로 변환됩니다. 이는 오른쪽 피연산자의 값을 왼쪽 변수에 할당하는 할당 연산자 '='를 사용하여 수행됩니다.


이 프로그램은 유형 캐스팅을 사용하여 원의 면적을 계산합니다.

#include
#include
사용하여 네임스페이스 성병 ;
정수 기본 ( )
{
정수 반지름 ;
시합 <> 반지름 ;
뜨다 영역 = M_PI * 반지름 * 반지름 ;
시합 << '반경이 있는 원의 면적' << 반지름 << ' = ' << 영역 ;
}

할당 연산자는 정수 데이터 유형의 반경 값으로 구성된 영역에 부동 소수점 값을 할당하는 데 사용됩니다.

원의 면적은 float 데이터 형식으로 반환되고, 반경은 정수 데이터 형식으로 입력됩니다. 따라서 변수의 데이터 유형은 할당 연산자를 사용한 유형 캐스팅을 통해 변경됩니다.

C++에서 캐스트 연산자를 사용한 유형 변환

유형 변환은 프로그램의 필요에 따라 하나의 데이터 유형을 다른 유형으로 변경하는 캐스트 연산자를 사용하여 수행됩니다.

네 가지 Cast Operator가 있습니다.

  • static_cast
  • const_cast
  • 동적_캐스트
  • 재해석_캐스트

1: static_cast

static_cast는 부동 소수점과 문자를 정수 등으로 명시적으로 변환하는 데 사용되는 캐스팅 연산자입니다. 가장 기본적인 캐스트 연산자입니다. 본질적으로 유사한 데이터 유형을 캐스팅할 수 있습니다. 포인터를 한 형식에서 다른 형식으로 변환할 수 있으므로 메모리 관리에도 사용할 수 있습니다.

통사론

static_cast ( 표현 )


이 프로그램은 static_cast를 사용하여 double 변수를 int 데이터 유형으로 변환하도록 작성되었습니다. 출력에서 소수 부분이 잘립니다.

#include
사용하여 네임스페이스 성병 ;
정수 기본 ( )
{
//변수 선언
더블 ;
= 2,905 * 1,235 * 24,675 ;
뜨다 결과 ;

시합 << ' 정적 캐스트를 사용하기 전에:' << ;
시합 << ' p의 값 = ' << << ;

// static_cast를 사용하여 데이터 유형을 변환합니다.
결과 = static_cast ( ) ;
시합 << ' 정적 캐스트를 사용한 후: ' << ;
시합 << ' 결과 값 = ' << 결과 << ;

반품 0 ;
}

처음에는 이중 변수 p에 서로 곱해진 값이 로드되어 결과에 저장됩니다. 결과에는 static_cast 연산자 앞과 뒤의 결과가 포함됩니다.

static_cast 연산자를 사용하기 전에는 결과가 소수점으로 표시되고, 이 연산자를 사용한 후에는 정수 데이터 형식으로 표시됩니다.

2: const_cast

const_cast 연산자는 객체의 상수 값을 상수가 아닌 유형으로 변환하는 데 사용됩니다. 상수 객체가 선언된 곳에 사용되며, 때때로 그 값을 변경해야 합니다.

통사론

const_cast ( 표현 )


이 예에서는 const_cast 연산자를 사용하여 상수 한정자를 일시적으로 제거하고 필요에 따라 변수를 변경할 수 있습니다.

#include
사용하여 네임스페이스 성병 ;
정수 기본 ( ) {
const 정수 엑스 = 70 ;
const 정수 * 그리고 = & 엑스 ;
시합 << '이전 값은 ' << * 그리고 << ' \N ' ;
정수 * 와 함께 = const_cast ( 그리고 ) ;
* 와 함께 = 90 ;
시합 << '새 값은 ' << * 그리고 ;
반품 0 ;
}

상수 한정자는 int 변수 x에 할당됩니다. 즉, 이 변수는 직접 수정할 수 없습니다. 그 후 포인터인 int *y를 사용하여 x에 액세스하지만 여전히 변경할 수 없으며 원래 값은 cout을 사용하여 표시됩니다. const_cast 연산자를 사용하면 상수가 아닌 포인터 z가 생성되고, 이를 편집 가능하게 만드는 x 값에 액세스하는 데 사용됩니다. x의 값을 간접적으로 변경하는 90으로 z에 할당된 값을 변경합니다.

처음에는 상수 변수 x의 값이 70이고 const_cast 연산자를 사용하여 수정되어 90이 됩니다.

3: 동적_캐스트

유형 안전 다운캐스트라고도 하는 상속 계층 구조를 사용합니다. 다운 캐스팅은 참조 또는 포인터를 기본 클래스 참조 또는 포인터에서 파생 클래스로 변환하는 프로세스입니다.

통사론

동적_캐스트 ( 표현 )


이 예제에서 Dynamic_cast 연산자는 다형성 클래스의 유형을 확인하는 데 사용되며 기본 클래스 멤버와 파생 클래스 멤버 모두에 대한 액세스를 허용합니다.

#include
#include <예외>
사용하여 네임스페이스 성병 ;
수업 TBase
{
공공의 :
뜨다 베이스_g = 9.81 ;

가상 무효의 가짜의 ( )
{

} ;
} ;

수업 T파생 : 공공의 TBase
{
공공의 :
정수 local_g = 9.78 ;
} ;

정수 기본 ( )
{

TBase * 베이스 = 새로운 T파생 ;
T파생 * 파생된 ;

파생된 = 동적_캐스트 ( 베이스 ) ;

시합 < 베이스_g << ;
시합 < local_g << ;

getchar ( ) ;
반품 0 ;
}

두 클래스는 기본 클래스와 파생 클래스로 정의됩니다. TBase* 유형의 포인터 기반이 생성되어 TDerived 유형의 동적으로 할당된 객체에 할당됩니다. 이 다형성 인스턴스에서는 파생 클래스 개체를 기본 클래스 포인터에 할당할 수 있습니다. Dynamic_cast는 포인터가 TDerived의 유효한 객체에 액세스하는지 확인합니다. 캐스트가 성공적인 결과를 얻으면 파생 클래스는 유효한 결과를 얻습니다. 그렇지 않으면 null 값을 반환합니다.

4: reinterpret_cast

reinterpret_cast는 한 데이터 유형의 포인터를 다른 데이터 유형의 포인터로 변환합니다. 포인터의 데이터 유형이 동일한지 여부는 확인하지 않습니다. 이 캐스팅 오퍼레이터는 주의 깊게 사용하고 취급해야 합니다.


이 그림에서는 reinterpret_cast를 사용하여 한 데이터 유형의 포인터가 다른 데이터 유형의 포인터로 재해석됩니다.

#include
사용하여 네임스페이스 성병 ;

정수 기본 ( )
{
정수 * = 새로운 정수 ( 70 ) ;
* 채널 = 재해석_캐스트 ( ) ;
시합 << * << ;
시합 << * 채널 << ;
시합 << << ;
시합 << 채널 << ;
반품 0 ;
}

처음에는 정수에 값 70이 할당됩니다. 포인터 q는 동적으로 할당된 정수를 가리킵니다. reinterpret_cast는 포인터 q를 문자 포인터 ch로 재해석하는 데 사용됩니다. 이는 원래 q에 할당된 메모리가 이제 문자인 것처럼 처리된다는 의미입니다. cout 명령을 사용하여 q 및 ch에 할당된 값을 인쇄합니다. ch는 문자 포인터로 취급되므로 문자 값을 반환합니다.

*ch를 사용하여 ch를 가리키는 값을 인쇄합니다. 그러나 ch는 문자 포인터로 처리되므로 이 줄은 메모리를 문자로 해석합니다. ch를 사용하여 포인터 ch에 저장된 메모리 주소를 인쇄합니다. 이것은 단지 동일한 메모리를 재해석한 것이기 때문에 q와 동일한 메모리 주소입니다.

처음에 정수는 70을 저장합니다. 나중에 이것은 포인터 q와 포인터 ch 사이에서 조작됩니다. 두 번째 값은 reinterpret_cast를 사용하여 재해석되므로 출력 2와 4는 동일합니다.

메모 : 개체를 휴대할 수 없는 제품으로 만들기 때문에 많이 필요할 때까지 이 캐스트 연산자를 사용하지 않는 것이 좋습니다.

결론

한 변수의 데이터 유형을 다른 변수로 변경하는 프로세스를 C++에서는 유형 변환 또는 유형 캐스팅이라고 합니다. 이는 데이터 유형이 서로 호환되도록 만들어 다양한 데이터 유형의 변수에 대한 수학적 연산을 수행하기 위해 수행됩니다. 유형 변환은 코드를 최적화합니다. C++에는 암시적 및 명시적 유형 변환이 있습니다. 암시적 유형 변환은 미리 정의된 규칙 세트를 사용하여 컴파일러 자체에서 수행되는 반면 명시적 유형 변환은 프로그래머가 할당 연산자 및 캐스트 연산자를 사용하여 수행됩니다.