「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > 64 ビット マシンでポインタを整数に安全に変換するにはどうすればよいですか?

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

2024 年 12 月 23 日に公開
ブラウズ:524

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 

void *p;
auto i = reinterpret_cast<:uintptr_t>(p);

正しいデータ型の選択

ポインタを整数として格納する場合、選択することが重要です適切なデータ型。この目的には、uintptr_t 型が最適です。

// C  11
std::uintptr_t i;

// C  03
extern "C" {
#include 
}
uintptr_t i;

// C99
#include 
uintptr_t i;

正しいキャスト演算子の使用

C には、さまざまなタイプのキャストが存在します。この特定のシナリオでは、reinterpret_cast が最も適切な選択です。

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

// C  03
uintptr_t i = reinterpret_cast(p);

// C
uintptr_t i = (uintptr_t)p;
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3