关于取高位和低位的宏的问题
#define LOWORD(l) ((WORD)(((DWORD_PTR)(l)) & 0xffff))
#define HIWORD(l) ((WORD)((((DWORD_PTR)(l)) >> 16) & 0xffff))
这是微软定义的去高位低位的宏
typedef _W64 unsigned long ULONG_PTR, *PULONG_PTR;
typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR;
DWORD_PTR的定义。
这里面我不太明白为什么要 &0xffff即使不&0xffff不是也能实现截取高位和地位么?
虽然0xffff是二进制全一的数,但是似乎这里面有点多余,是出于安全的考虑么?
求解。
[解决办法]
因为有符号数右移填充符号位。
[解决办法]
DWORD是两个字节,0xffff是一个字节。
要取高字节或低字节都只是一个字节。
0xffff 就是 0x0000FFFF,这样你应该就明白了。
[解决办法]
#define LOWORD(l) ((WORD)(((DWORD_PTR)(l)) & 0xffff))
#define HIWORD(l) ((WORD)((((DWORD_PTR)(l)) >> 16) & 0xffff))
这个宏是对DWORD_PTR类型使用的,求高位字和低位字的,
取低位字相当取最后2个字节,所以清空了除后2个字节以外的位,再强转。
DWORD_PTR word = 0x12345678;
printf("%#x,%#x\n", LOWORD(word), HIWORD(word));