정체불명의 모모
[c++] reinterpret_cast 본문
또! 새로운 캐스트가 나타났습니다.
도대체 컴퓨터 언어 문법(?)의 다양함은
말로 이룰 수가 없네요
오늘도 그저 정리 할 뿐.....
머리에 박고 갑시다!!!!
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++)' 카테고리의 다른 글
[Effective C++] Const에 대해 알아보자 (0) | 2021.10.26 |
---|---|
[C++] 가상 함수(virtual function) 와 가상함수테이블(virtual table) (0) | 2021.10.08 |
[c++ / 리눅스] Condition Variable (0) | 2021.09.15 |
[c언어] Mutex , cond 기본정리 (0) | 2021.09.14 |
[c++]static_cast 란? (0) | 2021.09.08 |
Comments