有没有一种安全的方法将DWORD_PTR转换为DWORD?

时间:2017-02-08 08:44:14

标签: c++ casting mfc dword

我实现了这个函数来从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;
}

1 个答案:

答案 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);