“& 0xFFFFFFFF”在这个HIDWORD宏中做了什么

时间:2010-12-15 05:36:10

标签: c++ macros dword

我需要HIDWORD宏来处理我正在制作的程序并在此处找到此程序:http://gnuwin32.sourceforge.net/compile.html

我感到困惑的是为什么最后会有&0xFFFFFFFF

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

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

3 个答案:

答案 0 :(得分:4)

我认为它没有任何实际效果 - (DWORD)演员 表达式的最后一个操作无论如何都会将结果强制为32位。

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

但它也没有受伤。有人可能会争辩说它会使宏的意图更清晰(除了你,也许 - 只是开玩笑!)。

答案 1 :(得分:1)

它通过显式屏蔽高阶位来处理可能的sign extension。您的编译器实际是否签署扩展以实现负面的右移是实现定义的。

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

例如:

11111110

是-2,如果我们假设它是一个8位二进制补码数。如果我们做一个简单的logical shift权利,我们会得到:

01111111

然而,这改变了数字的符号。许多编译器都会进行算术移位,给出:

11111111

请注意,我们用1来填写最重要的位(对于更复杂的示例,它将超过一个)。

答案 2 :(得分:0)

假设这些是无符号类型,并且假设DWORD是32位且DWORDLONG是64位,那么从技术上讲它不会做任何事情。

也许这只是代码类型的类似宏的复制和粘贴留下的代码?

或许我记下的假设并不成立。

干杯&第h。,