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
865 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!

source:php.cn
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