4

我正在制作的程序需要 HIDWORD 宏,并在这里找到了这个:http: //gnuwin32.sourceforge.net/compile.html

我很困惑的是为什么&0xFFFFFFFF它的末尾有一个?

#define HIDWORD(l) ((DWORD)(((DWORDLONG)(l)>>32)&0xFFFFFFFF))

这如何以任何方式修改此宏的输出?

4

3 回答 3

5

我认为它没有任何实际效果 -(DWORD)表达式的最终操作将强制结果为 32 位的强制转换。

强制转换强制移位操作对(DWORDLONG)无符号值起作用,因此不会将“符号位”转移到中间结果中。但是,由于操作数可能是 64 位,因此在比第 31 位更高的位置可能仍然有非零位。该& 0xFFFFFFFF操作会将这些位清零,但强制转换也是如此(DWORD)

但这也不痛。有人可能会争辩说,它使宏的意图更清晰(也许对你来说除外 - 开个玩笑!)。

于 2010-12-15T05:44:48.203 回答
1

它通过显式屏蔽高位来处理可能的符号扩展。您的编译器是否真的负数的右移进行符号扩展是实现定义的。

编辑:符号扩展是指设置高位以在数字移位时保持符号。

例如:

11111110

是 -2,如果我们假设它是一个 8 位二进制补码数。如果我们做一个简单的逻辑右移,我们得到:

01111111

但是,这会改变数字的符号。许多编译器会做一个算术移位,给出:

11111111

请注意,我们用 1 填充了最重要的位(对于更复杂的示例,它可能不止一个)。

于 2010-12-15T05:39:03.007 回答
0

假设这些是无符号类型,并且假设DWORD是 32 位和DWORDLONG64 位,那么从技术上讲它什么都不做。

也许它只是为签名类型复制和粘贴类似宏的代码?

或者也许我注意到的一个假设不成立。

干杯&hth.,

于 2010-12-15T06:20:35.870 回答