这在C#中意味着什么?我该如何使用它?

时间:2017-04-11 20:54:04

标签: c# c++ reverse-engineering

我在C ++中有以下代码,我正在IDA Pro中查看:

__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值。

1 个答案:

答案 0 :(得分:1)

在C#中,!运算符不能应用于这样的非布尔类型 - 众所周知,C和C ++程序员都会感到惊讶。

要修复您的旗帜检查,您需要写

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

由于运算符优先级,所有括号都是必需的。没有"中间"括号," 8 == 0"将在评估之前进行评估。并导致另一个编译器错误,"运算符&不能应用于int和bool"。