这行代码是什么意思(按位运算符)

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)))是宏中另一个常见的习惯用法:将整个表达式放在括号中以避免运算符优先级错误。然后可以始终使用宏,就像它是一个函数一样。

以上是关于这行代码是什么意思(按位运算符)的主要内容,如果未能解决你的问题,请参考以下文章

按位或运算符 | C中用于对齐内存块的用法[重复]

a|=b 是什么意思

&在Java中是啥意思?

Excel中这行代码是啥意思,求翻译

java运算中&是啥意思,比如a=1;b=2;a&b=多少

0xff 啥意思