> 백엔드 개발 > C++ > 64비트 시스템에서 포인터를 정수로 안전하게 변환하려면 어떻게 해야 합니까?

64비트 시스템에서 포인터를 정수로 안전하게 변환하려면 어떻게 해야 합니까?

Linda Hamilton
풀어 주다: 2024-11-10 19:30:02
원래의
865명이 탐색했습니다.

How Can I Safely Convert a Pointer to an Integer on 64-Bit Machines?

포인터를 정수로 변환: 64비트 시스템에 대해 다시 검토

C/C에서 64-비트를 처리할 때 발생할 수 있는 함정 포인터를 처리할 때 비트 머신이 발생합니다. 아래에 표시된 것과 같은 기존 변환 기술은 정밀도 오류를 초래할 수 있습니다.

void function(MESSAGE_ID id, void* param) {
  if (id == FOO) {
    int real_param = (int)param;
    // ...
  }
}
로그인 후 복사

업데이트된 캐스팅 기술을 사용한 솔루션

이 문제를 수정하고 원활한 연결을 보장하려면 32비트와 64비트 시스템 모두에서 호환성을 유지하기 위해 최신 C 접근 방식은 권장 사항:

#include <cstdint>

void *p;
auto i = reinterpret_cast<std::uintptr_t>(p);
로그인 후 복사

올바른 데이터 유형 선택

포인터를 정수로 저장할 때 적절한 데이터 유형을 선택하는 것이 중요합니다. 이를 위해서는 uintptr_t 유형이 가장 적합합니다.

// C++11
std::uintptr_t i;

// C++03
extern "C" {
#include <stdint.h>
}
uintptr_t i;

// C99
#include <stdint.h>
uintptr_t i;
로그인 후 복사

올바른 캐스팅 연산자 사용

C에는 다양한 유형의 캐스트가 존재합니다. 이 특정 시나리오에서는 reinterpret_cast가 가장 적절한 선택입니다.

// C++11
auto i = reinterpret_cast<std::uintptr_t>(p);

// C++03
uintptr_t i = reinterpret_cast<uintptr_t>(p);

// C
uintptr_t i = (uintptr_t)p;
로그인 후 복사

위 내용은 64비트 시스템에서 포인터를 정수로 안전하게 변환하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿