根据microsoft HIWORD宏从指定的32位值中检索高位字。正确的方法通过C宏检索高位字
宏的原始定义是:
#define HIWORD(l) ((WORD)((((DWORD_PTR)(l)) >> 16) & 0xffff))
例如,如果所传递的参数是一个unsigned long
值0×12345678,返回结果为0x1234的
重写宏如下:
#define MYHIWORD(l) ((WORD)(((DWORD_PTR)(l)) >> 16))
返回的结果是相同的值为0x1234
我的问题:
当传递相同的参数,为什么宏观返回相同的结果?
什么是AND操作(& 0xffff)在第一个宏的目的是什么?
你有没有在一个普通的(带符号)'long'初始化0xFEDCBA98,它有高位设置?很大程度上取决于WORD和DWORD_PTR类型。他们可能来自微软(''或其附近),但我不知道他们代表的'真实'类型是什么。 –
@JonathanLeffler在这两种情况下(有符号或无符号)长它返回0xFEDC – boleto
行;那么DWORD_PTR类型必须是无符号类型,并且掩码不相关。如果它是一个有符号类型,并且如果编译器执行了“算术右移”而不是“逻辑右移”,那么将0xFEDCBA98右移16位的结果将是0xFFFFFEDC,并且需要掩码来移除前四个F 。您可能需要了解将Windows移植到DEC Alpha和Intel Itanium的尝试,以了解可能曾经是类型名称后面的平台依赖项,即使它们现在已针对Intel IA-32和x86/64进行了修复。 –