#define MAKELONG(a, b) ((LONG)(((WORD)((DWORD_PTR)(a) & 0xffff)) | ((DWORD)((WORD)((DWORD_PTR)(b) & 0xffff))) << 16))
这个是windows sdk中的一个宏,
俺不太清楚这里(WORD)((DWORD_PTR)(a) & 0xffff)为啥要先转换成WORD,然后再转换成DWORD,
直接转换成DWORD会有啥问题吗.注: 俺比较笨,回答的朋友请讲详细点,最好有例子或可参考的资料,不要回"存在溢出问题"之类的简短回答

解决方案 »

  1.   

    唉。宏本意是你传2个值。当然,每个不超过2个字节。超过也不所谓,看到这个了吧:
    (WORD)((DWORD_PTR)(a) & 0xffff))。超过了也把你阉了。
    为啥呢?
    因为LONG是4个字节,你传2个,一个高位的2个字节,一个低位的2个字节。WORD就是2个字节。明白了吧
      

  2.   

    那为啥要先转成WORD呢,跟0xffff与运算之后前16位不是已经清空了吗,这里转成WORD有啥作用。
      

  3.   

    CSDN上很多人老喜欢不看清问题就回答,
    俺的问题是: 为啥要先转换成WORD,然后再转换成DWORD,直接转换成DWORD会有啥问题吗.
    俺的问题不是: 这个宏的作用是什么
      

  4.   

    没有实际意义,可以起到注释作用  (a) & 0xffff 已经完成功能了