«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как безопасно преобразовать указатель в целое число на 64-битных машинах?

Как безопасно преобразовать указатель в целое число на 64-битных машинах?

Опубликовано 23 декабря 2024 г.
Просматривать:518

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