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

使用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....都是一样的,关键是知道怎么去解析它...

你可能感兴趣的:(vc++)