这行代码是什么意思(按位运算符)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了这行代码是什么意思(按位运算符)相关的知识,希望对你有一定的参考价值。
#define LODWORD(x) (*((unsigned int*)&(x)))
我正在将C代码转换为python并且不能完全得到它。如果有人可以解释如何阅读这个或它意味着什么,将不胜感激。
这是获得64位变量的较低DWORD
(32位)的宏,最有可能是相关的HIDWORD
宏以获得更高的32位。其他评论指出了宏的一些缺陷,但它是实现这一点的一个相当普遍的习惯用语。
一些等效的Python代码可能是:
def LODWORD(x):
return x & 0xFFFFFFFF
&(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
首先使用#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*)
被称为“演员运营商”。它将结果类型“指向foo
类型的指针”更改为“指向unsigned int
的指针”。
((unsigned int*)&(foo))
优先于运营商优先权。现在你有“指向unsigned int
记忆位置的foo
。
*((unsigned int*)&(foo))
在unsigned int
的内存位置返回foo
的值(即使foo
不是无符号整数,即使该内存位置违反了unsigned int
的对齐要求)。
(*((unsigned int*)&(foo)))
是宏中另一个常见的习惯用法:将整个表达式放在括号中以避免运算符优先级错误。然后可以始终使用宏,就像它是一个函数一样。
以上是关于这行代码是什么意思(按位运算符)的主要内容,如果未能解决你的问题,请参考以下文章