음, 형변환이야 그냥 static_cast<>로 뿅 해버리면 되는데 말이죠.
Direct3D Documentation을 읽다가 신기한 것을 발견했습니다. 사실, 이런 방법도 2D 때 모 사이트에서 본 건데 실험결과 이상한 값이 나와버려서 아닌가 보다 하고 있었죠.
일단 Documentation에 나온 것은..
m_pDevice9->SetRenderState(D3DRS_POINTSIZE, *((DWORD*)&pointSize));
요거 입니다(지금 파티클 시스템에 공부중이라서요).
신기한 것은 저 뒤의 *((DWORD*)&pointSize 이거 인데요.
float형의 pointSize의 주소값을 DWORD 주소로 캐스팅해서 집어 넣은 다음 그 안에 있는 값을 읽는다는 의미인데...
.......이게 됩니까?
아 사실 됩니다. 실험결과 static_cast로 한 DWORD는 이상한 그림이 출력되고 저렇게 주소를 캐스팅해서 하면 되더군요-_- 아니 왜!!!!
그래서 또 실험해봤습니다.
DWORD FloatToDworld(float f)
{
return *((DWORD*)&f);
}
void main()
{
cout << static_cast<DWORD>(20.0f) << endl;
cout << FloatToDworld(20.0f);
}
물론 여러분이 예상하셨다시피 다른 값이 출력됩니다.
그래서 질문은,
저 주소캐스팅이 어떻게 돌아가는지에 대해서 자세히 설명해 주시면 감사하겠습니다.
예상하기에는 컴퓨터 내부적인 부분까지 파고 들어가야 할 것 같은데 제가 이부분이 좀 약해서 말이죠-ㅅ-)
그럼 조언 기다리고 있겠습니다.
4바이트 메모리에 접근해야 할 메모리의 주소만을 기록하기 때문에, 주소들끼리의 형변환은 이론상은 무리없이 변환이 가능한게 포인터의 특징입니다. (물론 강제로 앞에 (DWORD*)를 붙이지 않으면 컴파일러는 경고를 표시해줍니다.)
이건 포인터의 강점이자, 생각 없이 형변환을 썼다간 엄청난 버그를 동반시켜주는 엉뚱한 결과만 초래할수도 있다는 약점이기도 합니다. 잘써야 하는 부분이죠.
참고로 void *는 어떠한 형변환도 다 받아줄수 있는 무적의 포인터입니다. (...)