我需要HIDWORD宏来处理我正在制作的程序并在此处找到此程序:http://gnuwin32.sourceforge.net/compile.html
我感到困惑的是为什么最后会有&0xFFFFFFFF
?
#define HIDWORD(l) ((DWORD)(((DWORDLONG)(l)>>32)&0xFFFFFFFF))
如何以任何方式修改此宏的输出?
答案 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。,