注册 登录
编程论坛 VC++/MFC

-----帮忙看2行源码----

sdudy 发布于 2010-11-08 19:53, 1099 次点击
#define LOWORD(l) ((WORD)(l))
#define HIWORD(l) ((WORD)(((DWORD)(l) >> 16) & 0xFFFF))


问题:
1,LOWORD(l)是什么意思?参数1又是什么意思?
2,(WORD)(l)和(DWORD)(l)又是什么意思?
3,(WORD)(l)>> 16是什么意思?
4,(((DWORD)(l) >> 16) & 0xFFFF))是什么意思?
5,((WORD)(((DWORD)(l) >> 16) & 0xFFFF))是什么意思?
6,#define HIWORD(l) ((WORD)(((DWORD)(l) >> 16) & 0xFFFF))整句又是怎么意思?



4 回复
#2
玩出来的代码2010-11-11 22:55
#define LOWORD(l) ((WORD)(l))
取低16位,
#define HIWORD(l) ((WORD)(((DWORD)(l) >> 16) & 0xFFFF))
取高16位。先将l转换为DWORD,这是为防止传进以个小于16位的数造成的未定义行为,右移16位得到高16位值 再与0xFFFF & 操作,这个知道吧,在这里DWORD已经是无符号数了标准的右移操作会将右移后的数值的高16为补0的,这样的话与0xFFFF相与没什么用,可能是为了某些意外吧.
如果将小写的l改成大写的L,你就不会有疑问了,其他的同理。
#3
xmnathan2010-11-12 23:35
这两个宏是为了把存在DWORD(无符号的32位数 )中的两个WORD(16位的数)数据取出来
LOWORD(l)取低位16位
HIWORD(l)取高位16位

对应的存储方法是MAKELONG
MAKELONG 是一个宏,将两个16位的数联合成一个无符号的32位数   
#define   MAKELONG(a,b)   ((LONG)(((WORD)(a))|((DWORD)((WORD)(b)))<<16))
#4
jianghong_022010-11-13 08:43
这两个宏是为了把存在DWORD(无符号的32位数 )中的两个WORD(16位的数)数据取出来
LOWORD(l)取低位16位
HIWORD(l)取高位16位

先将l转换为DWORD,这是为防止传进以个小于16位的数造成的未定义行为,右移16位得到高16位值 再与0xFFFF & 操作,这个知道吧,在这里DWORD已经是无符号数了标准的右移操作会将右移后的数值的高16为补0的,
其实就是一种汇编的处理方法,,,,&它的意思是把进来的每一个数按位相乘
#5
lucky5635912010-11-19 07:55
怎么都是大写?
1