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

问题描述 投票:2回答:3
#define LODWORD(x) (*((unsigned int*)&(x)))

我正在将C代码转换为python并且不能完全得到它。如果有人可以解释如何阅读这个或它意味着什么,将不胜感激。

c pointers bitwise-operators
3个回答
2
投票

这是获得64位变量的较低DWORD(32位)的宏,最有可能是相关的HIDWORD宏以获得更高的32位。其他评论指出了宏的一些缺陷,但它是实现这一点的一个相当普遍的习惯用语。

一些等效的Python代码可能是:

def LODWORD(x):
    return x & 0xFFFFFFFF

3
投票
&(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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.