2017-04-11 56 views
0

我在IDA Pro的獲得在C以下代碼++,我正在看:在C#中這意味着什麼?我如何使用它?

__int64 __fastcall sub_14023B480(__int64 a1) 
{ 
    return *(_DWORD *)(a1 + 0x384) > 0 && !(*(_BYTE *)(a1 + 0xE8) & 8) && !(*(_DWORD *)(a1 + 0x290) & 0x800000); 
} 

a1是一個實體。

0x384指向健康值。

0xE80x290指向某種標誌,但怎麼來的,我不能寫這樣的檢查在C#:

if(!(a1 + 0xE8) & 8) 
{ 
    //Do something 
} 

因爲在C#中int值的&運營商的收益。

+3

'(...&8)== 0'? – Ryan

+0

C#版本中'a1'的類型是什麼? Int64的?將類型後綴附加到數字文字以匹配表達式的其餘部分。顯示完整的代碼,以及你得到什麼樣的編譯器錯誤或運行時異常? 「... int value ...」:二元運算符&採用整型,long/ulong就是這樣。 – dlatikay

回答

1

在C#中,!運算符不能應用於像這樣的非布爾類型 - 這是一個衆所周知的讓C和C++程序員驚訝的事實。

要解決你的標誌檢查,你會寫

if (((a1 + 0xE8) & 8) == 0) 
{ 
    //Do something 
} 

所有的括號是必需的,因爲運算符優先級。如果沒有「中間」括號,則會在&之前評估「8 == 0」,並導致另一個編譯器錯誤,「運算符&不能應用於int和bool」。