首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于取高位和低位的宏的有关问题

2013-07-21 
关于取高位和低位的宏的问题#define LOWORD(l)((WORD)(((DWORD_PTR)(l)) & 0xffff))#define HIWORD(l)((WO

关于取高位和低位的宏的问题
#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));

[解决办法]
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

#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));



但是,如果取低位直接强转,不是也可以获得低位么?

没说明白,额。
直接把原来的数强,比如说,是双字强转为单字,不久可以直接获取低位了么?
而不用和0xffff 按位与

错别字是硬伤啊。。。。。
直接把原来的数强转,比如说,是双字强转为单字,不久可以直接获取低位了么?

注意符号位
[解决办法]
因为无论WORD和DWORD都是无符号的,因此不用&0xffff结果也是没问题的,不过这一切基于无符号,并且截断取剩余部分

热点排行