Есть ли безопасный способ приведения DWORD_PTR в DWORD?

Я реализовал эту функцию для преобразования dword_ptr в dword, но если есть другой способ с меньшим количеством кода, который будет оценен.
этот код должен быть совместим с 32-битными и 64-битными окнами
я видел этот вопрос но ответ содержит новые операции и операции удаления

inline unsigned long Convert_to_DWORD(unsigned long long data)
{
//typedef unsigned __int64 ULONG_PTR
//typedef ULONG_PTR DWORD_PTR
//typedef unsigned long       DWORD;
assert(UINT_MAX > data);
unsigned long* value = reinterpret_cast<unsigned long*>(&data);
return *value;
}

-1

Решение

Есть ли безопасный способ приведения DOWRD_PTR в DWORD?

Целочисленные типы неявно преобразуются друг в друга. Такое преобразование является безопасным в том смысле, что в нем не участвует UB

DOWRD_PTR original;
DOWRD converted = original;

В 64-битной системе DOWRD меньше, чем DOWRD_PTR, поэтому он не может представлять все значения, представляемые DOWRD_PTR. Поэтому, если вы выполняете обратное преобразование, вы не получите прежнее исходное значение, если только байты старшего разряда не оказались равными нулю. Кроме того, если DOWRD_PTR представляет значение указателя, то преобразование значения в DWORD, затем обратно в DWORD_PTR, затем обратно в указатель, тогда использование полученного указателя будет небезопасным.

Поскольку преобразование сужается, компилятор может сгенерировать предупреждение. Явное преобразование делает ваше намерение однозначным и должно заставить замолчать следующее предупреждение:

DOWRD converted = DWORD(original);
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector