[英]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.