我实现了这个函数来从dword_ptr转换为dword但是如果还有其他方法可以理解更少的代码。 此代码应与32位和64位窗口兼容 我见过this Question,但答案包含新操作和删除操作
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;
}
答案 0 :(得分: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);