wndows头文件中提供的位运算宏及地址强转操作符的小节(BYTE,WORD,DWORD,MAKEWORD,LOWORD,LOBYTE.....)

来源:互联网 发布:淘宝双12活动力度 编辑:程序博客网 时间:2024/05/11 09:31

使用vc经常会碰到使用MAKEWORD,LOWORD,LOBYTE等的情况,那么分析一下吧!

 

一.类型解析符(BYTE,WORD,DWORD)

学过汇编应该知道,一个数据过来了,其到底代表什么,需要我们自己指定,我们可以指定其读取方式是字节,字,或双字,如下:

 

    DWORD    dw = 0xffaabbcc;    //这是一个32位的值
    DWORD    dw1 = WORD(dw);        //输出  0X0000bbcc
    WORD    dw1 = WORD(dw);        //输出  0Xbbcc
    DWORD    dw2 = BYTE(dw);        //输出    0x000000CC    
    BYTE    dw2 = BYTE(dw);        //输出    0xCC    
    DWORD    dw3 = DWORD(dw);    //输出    0xffaabbcc

 

二.实例解析

 

#define MAKEWORD(a, b)      ((WORD)(((BYTE)(((DWORD_PTR)(a)) & 0xff)) | ((WORD)((BYTE)(((DWORD_PTR)(b)) & 0xff))) << 8))
#define MAKELONG(a, b)      ((LONG)(((WORD)(((DWORD_PTR)(a)) & 0xffff)) | ((DWORD)((WORD)(((DWORD_PTR)(b)) & 0xffff))) << 16))
#define LOWORD(l)           ((WORD)(((DWORD_PTR)(l)) & 0xffff))
#define HIWORD(l)           ((WORD)((((DWORD_PTR)(l)) >> 16) & 0xffff))
#define LOBYTE(w)           ((BYTE)(((DWORD_PTR)(w)) & 0xff))
#define HIBYTE(w)           ((BYTE)((((DWORD_PTR)(w)) >> 8) & 0xff))

这是在windef.h中的一段定义,原封不动。
(注:x:代表原值)
1.
    (DWORD_PTR)(a)                //把a当作双字读
    (DWORD_PTR)(a)) & 0xff        //把a与0x000000ff与,即把前面的24位全部屏蔽掉了,去了最后的一个字节的内容
    ((BYTE)(((DWORD_PTR)(a)) & 0xff)    //作为字节来读,此时输出应该是:0x000000xx
    (WORD)(((BYTE)(((DWORD_PTR)(a)) & 0xff)        //作为字来读,此时同样: 0x000000xx
   
    (((BYTE)(((DWORD_PTR)(b)) & 0xff))) << 8        //b在被砍成最后一个字节以后,又向左移了8位,成为: 0x0000xx00
   
    ((WORD)(((BYTE)(((DWORD_PTR)(a)) & 0xff)) | ((WORD)((BYTE)(((DWORD_PTR)(b)) & 0xff))) << 8))    //结果很清楚了,最后结果就是: 0x0000xxxx
   
    例: WORD    wd = MAKEWORD(255,0);    //输出    0x00ff
   
    总结:a,b被作为字节量对待,多余的都会被砍掉,即使a= 0x ffffaabb,最终,其作用的只是最后的bb。

2.
    同上。
    总结:a,b被作为字对待。

3.....


三:总结

其他很多类似的宏,RGB....都是一样的,关键是知道怎么去解析它...