Maison > développement back-end > C++ > Comment puis-je convertir en toute sécurité un pointeur en entier sur des machines 64 bits ?

Comment puis-je convertir en toute sécurité un pointeur en entier sur des machines 64 bits ?

Linda Hamilton
Libérer: 2024-11-10 19:30:02
original
918 Les gens l'ont consulté

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

Conversion d'un pointeur en entier : revisité pour les machines 64 bits

En C/C, un écueil potentiel lorsqu'il s'agit de 64-Bits Les machines à bits surviennent lors de la manipulation des pointeurs. Les techniques de conversion traditionnelles, telles que celle présentée ci-dessous, peuvent entraîner des erreurs de précision :

void function(MESSAGE_ID id, void* param) {
  if (id == FOO) {
    int real_param = (int)param;
    // ...
  }
}
Copier après la connexion

Solution avec des techniques de diffusion mises à jour

Pour corriger ce problème et garantir une conversion transparente compatibilité sur les systèmes 32 bits et 64 bits, une approche C moderne est recommandée :

#include <cstdint>

void *p;
auto i = reinterpret_cast<std::uintptr_t>(p);
Copier après la connexion

Choisir le type de données correct

Lors du stockage d'un pointeur en tant que un entier, il est crucial de sélectionner le type de données approprié. À cette fin, le type uintptr_t est le plus approprié.

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

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

// C99
#include <stdint.h>
uintptr_t i;
Copier après la connexion

Employer le bon opérateur de casting

En C , différents types de castings existent. Pour ce scénario spécifique, reinterpret_cast est le choix le plus approprié.

// 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;
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal