MAKEWORD,LOWORD,LOBYTE"/>
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....都是一样的,关键是知道怎么去解析它...
更多推荐
MAKEWORD,LOWORD,LOBYTE
发布评论