정체불명의 모모

[c++] reinterpret_cast 본문

프로그래밍(c++)

[c++] reinterpret_cast

정체불명의 모모 2021. 9. 15. 17:33

또! 새로운 캐스트가 나타났습니다.

도대체 컴퓨터 언어 문법(?)의 다양함은 

말로 이룰 수가 없네요

오늘도 그저 정리 할 뿐.....

머리에 박고 갑시다!!!!


reinterpret_cast란?
reinterpret_cast<type_id>(expression);  type_id : 바꿀 타입 / expression : 대상

: 포인터가 다른 포인터 형식으로 변환될 수 있도록 합니다.
  또한 정수 계열 형식이 포인터 형식으로 변환될 수 있도록 하고 그 반대로도 변환될 수 있도록 합니다.

 

포인터-> 포인터     포인터 -> 일반 변수    일반변수 -> 포인터

자료형 -> 다른 자료형

 

 reinterpret_cast는 형변환이 이뤄지게 되면 해당 자료형의 bit수에 맞게 들어가게 됩니다.

이 캐스팅은 (void*) 로도 전달이 가능하기 때문에 특수한 경우에 쓰입니다.

 

▷ if? / int* -> char -> int*로 간다면 ?

  •   결과 : 주소 값이 파괴되어 nullptr을 가르키게 됩니다.
  •   이유 : char형은 1바이트 크기여서 주소 값을 다 표현하지 못하기 때문입니다.
      이는 reinterpret_cast에 특징 때문인데, 자료를 그대로 변수로 전달하게 됩니다.(bit 단위로)
      때문에 int* -> unsinged int or ling -> int* 같은 경우에는 데이터가 그대로 유지 되게 됩니다.
      주소 값을 모두다 채울 수 있는 크기이기 때문이죠. 하지만 char는 바이트 수가 작기 때문에 데이터를 옮기는 과정에서
      dump가 되버려 원본 데이터가 파괴 되는 것이죠.

나쁜 예시 코드 

결국 컴파일러가 경고를 날리고 있습니다.

해석 : 포인터에서 작은 유형 'char'로 캐스트하면 정보가 손실됩니다.
그렇기 때문에 아예 되지 않는걸 확인할 수 있습니다.

 

정상 예시 코드

노란 경고는 무시
결과 창

 변환 1 : int* -> long -> int*

 변환 2 : int* -> long long -> int*

 

다시 int*로 변환을 시키니깐 정상적인 값이 나오는 것을 확인 할 수 있다.


노란 경고는 무시
결과 창

 변환 1 : int* -> void -> long*

정상적으로 값이 나오는것을 알 수 있다.


참고 사이트

https://hwan-shell.tistory.com/219

 

C++] reinterpret_cast에 대해서...

모든 언어에는 형변환이 있습니다. C++에선 다양한 형번환 객체들을 제공합니다. 1. static_cast = https://hwan-shell.tistory.com/211 2. dynamic_cast = https://hwan-shell.tistory.com/213 3. const_cast =..

hwan-shell.tistory.com

 

Comments