2013-07-07 23 views
0

根据microsoft HIWORD宏从指定的32位值中检索高位字。正确的方法通过C宏检索高位字

宏的原始定义是:

#define HIWORD(l) ((WORD)((((DWORD_PTR)(l)) >> 16) & 0xffff)) 

例如,如果所传递的参数是一个unsigned long0×12345678,返回结果为0x1234的

重写宏如下:

#define MYHIWORD(l) ((WORD)(((DWORD_PTR)(l)) >> 16)) 

返回的结果是相同的值为0x1234

我的问题:

  • 当传递相同的参数,为什么宏观返回相同的结果?

  • 什么是AND操作(& 0xffff)在第一个宏的目的是什么?

+0

你有没有在一个普通的(带符号)'long'初始化0xFEDCBA98,它有高位设置?很大程度上取决于WORD和DWORD_PTR类型。他们可能来自微软(''或其附近),但我不知道他们代表的'真实'类型是什么。 –

+0

@JonathanLeffler在这两种情况下(有符号或无符号)长它返回0xFEDC – boleto

+1

行;那么DWORD_PTR类型必须是无符号类型,并且掩码不相关。如果它是一个有符号类型,并且如果编译器执行了“算术右移”而不是“逻辑右移”,那么将0xFEDCBA98右移16位的结果将是0xFFFFFEDC,并且需要掩码来移除前四个F 。您可能需要了解将Windows移植到DEC Alpha和Intel Itanium的尝试,以了解可能曾经是类型名称后面的平台依赖项,即使它们现在已针对Intel IA-32和x86/64进行了修复。 –

回答

1

什么是第一个宏的目的和操作(& 0xFFFF的)?

这是没有必要的,因为演员阵容将消除高阶比特。我猜这只是为了强调(给读者)位被删除的事实。

+0

这是否也意味着宏(最终没有掩码)不依赖于编译器? – boleto

+0

@boleto:它需要'WORD'和'DWORD_PTR'进行适当的typedeff。 –

相关问题