ホームページ > バックエンド開発 > C++ > 64 ビット マシン上でポインタを整数に安全に変換するにはどうすればよいですか?

64 ビット マシン上でポインタを整数に安全に変換するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-11-10 19:30:02
オリジナル
852 人が閲覧しました

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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート