포인터를 정수로 변환: 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!