簡體   English   中英

這行代碼是什么意思(按位運算符)

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM