"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo puedo convertir de forma segura un puntero en un número entero en máquinas de 64 bits?

¿Cómo puedo convertir de forma segura un puntero en un número entero en máquinas de 64 bits?

Publicado el 2024-12-23
Navegar:654

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

Conversión de un puntero en un número entero: revisada para máquinas de 64 bits

En C/C, un error potencial al tratar con 64 bits máquinas de bits surge al manipular punteros. Las técnicas de conversión tradicionales, como la que se muestra a continuación, pueden generar errores de precisión:

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

Solución con técnicas de conversión actualizadas

Para rectificar este problema y garantizar una compatibilidad perfecta en sistemas de 32 y 64 bits, se recomienda un enfoque C moderno:

#include 

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

Elegir el tipo de datos correcto

Al almacenar un puntero como un número entero, es crucial seleccionar el tipo de datos apropiado. Para este propósito, el tipo uintptr_t es el más adecuado.

// C  11
std::uintptr_t i;

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

// C99
#include 
uintptr_t i;

Emplear el operador de conversión correcto

En C, existen varios tipos de conversiones. Para este escenario específico, reinterpret_cast es la opción más adecuada.

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

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

// C
uintptr_t i = (uintptr_t)p;
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3