포인터를 다른 포인터로 캐스팅

JCob

지금 저는이 강의를보고 있습니다 : https://www.youtube.com/watch?v=jTSvthW34GU 영화의 약 50 분 동안 그는이 코드가 0이 아닌 값을 반환한다고 말합니다.

float f = 7.0;
short s = *(short*)&f;

내가 착각하는 경우 수정 :

  1. & f는 float에 대한 포인터입니다.
  2. & f를 가져 와서 short에 대한 포인터로 캐스팅합니다.
  3. 그런 다음 포인터를 역 참조 (동사인지 알 수 없음)하므로 결국 전체 문은 7의 값을 나타냅니다.

인쇄하면 0이 표시됩니다. 이유가 무엇입니까?

cdhowie

포인터를 다른 형식으로 캐스팅해도 가리키는 값이 변환되지 않습니다. 다른 유형의 "렌즈"를 통해 가리키는 바이트를 해석하는 것입니다.

일반적으로 포인터를 다른 포인터 유형으로 캐스팅하면 정의되지 않은 동작이 발생합니다. 이 경우 해당 동작은 아키텍처에 따라 달라집니다.

무슨 일이 벌어지고 있는지 그림을 얻기 위해 포인터가 주어진 객체의 비트를 표시하는 일반 함수를 작성할 수 있습니다.

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 

결과는 이제 매우 명확해야하지만 컴파일러 및 / 또는 아키텍처에 따라 다릅니다. 예를 들어, floatbig-endian 머신 에서 동일한 표현을 사용하면 의 바이트 float가 반전 되기 때문에 결과가 상당히 다릅니다 . 이 경우 short*가 바이트를 가리킬 것 01000000 11100000입니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

C : 다른 포인터 캐스팅

분류에서Dev

C : 다른 포인터 캐스팅

분류에서Dev

C ++-17 : 함수 포인터를 다른 인수 포인터 유형의 함수로 캐스팅

분류에서Dev

다른 크기의 정수에서 포인터로 캐스팅

분류에서Dev

함수 포인터를 C의 다른 함수 포인터로 캐스팅하는 것이 안전합니까?

분류에서Dev

다형성 포인터 캐스팅

분류에서Dev

다운 캐스팅 포인터

분류에서Dev

포인터를 정수로 캐스팅

분류에서Dev

포인터를 long으로 캐스팅

분류에서Dev

다른 아키텍처에서 포인터 유형 캐스팅

분류에서Dev

일부 변수의 합계를 포인터로 캐스팅 한 다음 다시 정수로 캐스팅

분류에서Dev

C ++에서 한 클래스의 포인터를 다른 클래스의 포인터로 캐스팅 할 수있는 이유는 무엇입니까?

분류에서Dev

캐스팅 포인터?

분류에서Dev

char 포인터로 캐스팅

분류에서Dev

포인터-구조체 포인터 + Malloc으로 캐스팅

분류에서Dev

멤버 함수에 대한 포인터 다운 캐스팅

분류에서Dev

포인터가있는 구조체를 통한 다형성 및 캐스팅

분류에서Dev

char 포인터를 int 포인터로 캐스팅-버퍼 오류 10

분류에서Dev

void가 아닌 반환 형식으로 람다를 함수 포인터로 캐스팅

분류에서Dev

다른 포인터 유형 T로 캐스팅 된 Void 포인터는 T처럼 작동하지 않습니다.

분류에서Dev

C에서 캐스팅 경고 : 할당은 캐스트없이 포인터에서 정수를 만듭니다.

분류에서Dev

const 포인터를 비 const로 캐스팅

분류에서Dev

다른 포인터를 기준으로 포인터 정렬

분류에서Dev

포인터 유형 캐스팅

분류에서Dev

C의 타입 캐스팅 포인터

분류에서Dev

버퍼에서 포인터 캐스팅

분류에서Dev

포인터 산술 및 캐스팅

분류에서Dev

함수 포인터 캐스팅

분류에서Dev

람다를 void *로 캐스트 한 다음 함수 포인터로 캐스팅 할 수없는 이유는 무엇입니까?

Related 관련 기사

  1. 1

    C : 다른 포인터 캐스팅

  2. 2

    C : 다른 포인터 캐스팅

  3. 3

    C ++-17 : 함수 포인터를 다른 인수 포인터 유형의 함수로 캐스팅

  4. 4

    다른 크기의 정수에서 포인터로 캐스팅

  5. 5

    함수 포인터를 C의 다른 함수 포인터로 캐스팅하는 것이 안전합니까?

  6. 6

    다형성 포인터 캐스팅

  7. 7

    다운 캐스팅 포인터

  8. 8

    포인터를 정수로 캐스팅

  9. 9

    포인터를 long으로 캐스팅

  10. 10

    다른 아키텍처에서 포인터 유형 캐스팅

  11. 11

    일부 변수의 합계를 포인터로 캐스팅 한 다음 다시 정수로 캐스팅

  12. 12

    C ++에서 한 클래스의 포인터를 다른 클래스의 포인터로 캐스팅 할 수있는 이유는 무엇입니까?

  13. 13

    캐스팅 포인터?

  14. 14

    char 포인터로 캐스팅

  15. 15

    포인터-구조체 포인터 + Malloc으로 캐스팅

  16. 16

    멤버 함수에 대한 포인터 다운 캐스팅

  17. 17

    포인터가있는 구조체를 통한 다형성 및 캐스팅

  18. 18

    char 포인터를 int 포인터로 캐스팅-버퍼 오류 10

  19. 19

    void가 아닌 반환 형식으로 람다를 함수 포인터로 캐스팅

  20. 20

    다른 포인터 유형 T로 캐스팅 된 Void 포인터는 T처럼 작동하지 않습니다.

  21. 21

    C에서 캐스팅 경고 : 할당은 캐스트없이 포인터에서 정수를 만듭니다.

  22. 22

    const 포인터를 비 const로 캐스팅

  23. 23

    다른 포인터를 기준으로 포인터 정렬

  24. 24

    포인터 유형 캐스팅

  25. 25

    C의 타입 캐스팅 포인터

  26. 26

    버퍼에서 포인터 캐스팅

  27. 27

    포인터 산술 및 캐스팅

  28. 28

    함수 포인터 캐스팅

  29. 29

    람다를 void *로 캐스트 한 다음 함수 포인터로 캐스팅 할 수없는 이유는 무엇입니까?

뜨겁다태그

보관