Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menukar Penunjuk kepada Integer dengan Selamat pada Mesin 64-Bit?

Bagaimanakah Saya Boleh Menukar Penunjuk kepada Integer dengan Selamat pada Mesin 64-Bit?

Linda Hamilton
Linda Hamiltonasal
2024-11-10 19:30:02850semak imbas

How Can I Safely Convert a Pointer to an Integer on 64-Bit Machines?

Menukar Penunjuk kepada Integer: Dilawati Semula untuk Mesin 64-Bit

Dalam C/C , kemungkinan perangkap apabila berurusan dengan 64- mesin bit timbul apabila mengendalikan penunjuk. Teknik penukaran tradisional, seperti yang ditunjukkan di bawah, boleh mengakibatkan ralat ketepatan:

void function(MESSAGE_ID id, void* param) {
  if (id == FOO) {
    int real_param = (int)param;
    // ...
  }
}

Penyelesaian dengan Teknik Casting yang Dikemas kini

Untuk membetulkan isu ini dan memastikan kelancaran keserasian pada kedua-dua sistem 32-bit dan 64-bit, pendekatan C moden adalah disyorkan:

#include <cstdint>

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

Memilih Jenis Data yang Betul

Apabila menyimpan penunjuk sebagai integer, adalah penting untuk memilih jenis data yang sesuai. Untuk tujuan ini, jenis uintptr_t adalah paling sesuai.

// C++11
std::uintptr_t i;

// C++03
extern "C" {
#include <stdint.h>
}
uintptr_t i;

// C99
#include <stdint.h>
uintptr_t i;

Menggunakan Operator Casting Betul

Dalam C , pelbagai jenis tuangan wujud. Untuk senario khusus ini, reinterpret_cast ialah pilihan yang paling sesuai.

// 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;

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menukar Penunjuk kepada Integer dengan Selamat pada Mesin 64-Bit?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn