[英]What does this line of code mean (Bitwise Operator)
#define LODWORD(x) (*((unsigned int*)&(x)))
我正在将C代码转换为python,无法完全理解。 如果有人能解释如何阅读本手册或它的含义,将不胜感激。
&(x) // get address of `x` as a pointer to whatever x is
(unsigned int*)(...) // cast it to a pointer to `unsigned int`
*(...) // then read that address' contents as if it was `unsigned int`
我会用union
,如果确实需要,且仅当我知道CPU架构,否则这是非常非常不安全的:P
这是一个宏,用于获取64位变量的低DWORD
(32位),最有可能是关联的HIDWORD
宏也可以获取高32位。 其他评论指出了宏的一些缺陷,但这是完成此操作的相当普遍的习惯。
一些等效的Python代码可能是:
def LODWORD(x):
return x & 0xFFFFFFFF
首先通过使用#define
定义一个进行替换的宏。 它是带有参数的宏,即所谓的“函数式宏”。 在#define
之后,当出现表达式LODWORD(whatever you write here)
时,它将被(*((unsigned int*)&(whatever you write here)))
替换,然后将代码送入编译器。 这称为“宏扩展”。 编译器将仅看到扩展表达式。
LODWORD(foo)
的宏扩展表达式执行以下操作:
(foo)
是宏中的常见用法:将参数放在括号中,以避免运算符优先级错误。
&(foo)
的意思是“的地址(foo)
”(一个“指针”)。 这将创建一个表示foo
的内存位置的值。 它的类型为“指向foo
类型的指针”。
(unsigned int*)&(foo)
将“ foo
的地址”转换为“ unsigned int
foo
的地址”。 运算符(insigned int*)
称为“ (insigned int*)
运算符”。 它将结果类型“ pointer to foo
of type”更改为“ pointer to unsigned int
”。
((unsigned int*)&(foo))
覆盖运算符优先级。 现在,您可以“指向foo
的内存位置中的unsigned int
。
*((unsigned int*)&(foo))
返回的值unsigned int
在的存储位置foo
(即使foo
不是一个无符号的整数,并且即使该存储器位置违反了一个对齐的要求unsigned int
)。
(*((unsigned int*)&(foo)))
是宏中的另一个常见用法:将整个表达式放在括号中以避免运算符优先级错误。 这样,宏就可以始终像是一个函数一样使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.