ポインタを整数に変換: 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 中国語 Web サイトの他の関連記事を参照してください。