C++ 什么是&;0xFFFFFFFF";在这个单词宏中做什么

C++ 什么是&;0xFFFFFFFF";在这个单词宏中做什么,c++,macros,dword,C++,Macros,Dword,我正在制作一个程序,需要HIDWORD宏,在这里找到了这个宏: 我感到困惑的是,为什么它的末尾有一个&0xFFFFFFFF #define HIDWORD(l) ((DWORD)(((DWORDLONG)(l)>>32)&0xFFFFFFFF)) 这是如何以任何方式修改此宏的输出的?它通过显式屏蔽高阶位来处理可能的问题。编译器是否确实为负数的右移进行符号扩展是由实现定义的 编辑:符号扩展是指设置高位,以便在数字移位时保留符号 例如: 11111110 是-2,如果我们假设

我正在制作一个程序,需要HIDWORD宏,在这里找到了这个宏:

我感到困惑的是,为什么它的末尾有一个
&0xFFFFFFFF

#define HIDWORD(l) ((DWORD)(((DWORDLONG)(l)>>32)&0xFFFFFFFF))
这是如何以任何方式修改此宏的输出的?

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

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

例如:

11111110
是-2,如果我们假设它是一个8位2的补码。如果我们做一个简单的正确操作,我们会得到:

01111111
但是,这会改变数字的符号。许多编译器将进行算术移位,以给出:

11111111

请注意,我们将最高有效位(对于更复杂的示例,它将不止一个)填充为1。

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

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


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

假设那些是无符号类型,假设
DWORD
是32位,
DWORDLONG
是64位,那么从技术上讲它什么都不起作用

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

或者我提到的一个假设不成立


Cheers&hth.,

DWORD
DWORDLONG
都是无符号类型,这里没有符号扩展。@Adam,很有趣,那么我不知道它的目的是什么。我认为这会影响可读性。我知道对无符号的强制转换会执行定义良好的模运算。如下所示:)我不知道(也可能猜错)为什么会有按位and。