지금 저는이 강의를보고 있습니다 : https://www.youtube.com/watch?v=jTSvthW34GU 영화의 약 50 분 동안 그는이 코드가 0이 아닌 값을 반환한다고 말합니다.
float f = 7.0;
short s = *(short*)&f;
내가 착각하는 경우 수정 :
인쇄하면 0이 표시됩니다. 이유가 무엇입니까?
포인터를 다른 형식으로 캐스팅해도 가리키는 값이 변환되지 않습니다. 다른 유형의 "렌즈"를 통해 가리키는 바이트를 해석하는 것입니다.
일반적으로 포인터를 다른 포인터 유형으로 캐스팅하면 정의되지 않은 동작이 발생합니다. 이 경우 해당 동작은 아키텍처에 따라 달라집니다.
무슨 일이 벌어지고 있는지 그림을 얻기 위해 포인터가 주어진 객체의 비트를 표시하는 일반 함수를 작성할 수 있습니다.
template <typename T>
void display_bits(T const * p)
{
char const * c = reinterpret_cast<char const *>(p);
for (int i = 0; i < sizeof(T); ++i) {
unsigned char b = static_cast<unsigned char>(*(c++));
for (int j = 0; j < 8; ++j) {
std::cout << ((b & 0x80) ? '1' : '0');
b <<= 1;
}
std::cout << ' ';
}
std::cout << std::endl;
}
다음 코드를 실행하면 무슨 일이 일어나는지 알 수 있습니다.
int main() {
float f = 7.0;
display_bits(&f);
display_bits(reinterpret_cast<short*>(&f));
return 0;
}
내 시스템의 출력은 다음과 같습니다.
00000000 00000000 11100000 01000000
00000000 00000000
결과는 이제 매우 명확해야하지만 컴파일러 및 / 또는 아키텍처에 따라 다릅니다. 예를 들어, float
big-endian 머신 에서 동일한 표현을 사용하면 의 바이트 float
가 반전 되기 때문에 결과가 상당히 다릅니다 . 이 경우 short*
가 바이트를 가리킬 것 01000000 11100000
입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다