Home > Article > Backend Development > How Can I Safely Convert a Pointer to an Integer on 64-Bit Machines?
Converting a Pointer into an Integer: Revisited for 64-Bit Machines
In C/C , a potential pitfall when dealing with 64-bit machines arises when handling pointers. Traditional conversion techniques, such as the one shown below, may result in precision errors:
void function(MESSAGE_ID id, void* param) { if (id == FOO) { int real_param = (int)param; // ... } }
Solution with Updated Casting Techniques
To rectify this issue and ensure seamless compatibility on both 32-bit and 64-bit systems, a modern C approach is recommended:
#include <cstdint> void *p; auto i = reinterpret_cast<std::uintptr_t>(p);
Choosing the Correct Data Type
When storing a pointer as an integer, it is crucial to select the appropriate data type. For this purpose, the uintptr_t type is most suitable.
// C++11 std::uintptr_t i; // C++03 extern "C" { #include <stdint.h> } uintptr_t i; // C99 #include <stdint.h> uintptr_t i;
Employing the Correct Casting Operator
In C , various types of casts exist. For this specific scenario, reinterpret_cast is the most appropriate choice.
// 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;
The above is the detailed content of How Can I Safely Convert a Pointer to an Integer on 64-Bit Machines?. For more information, please follow other related articles on the PHP Chinese website!