这在 C# 中意味着什么以及如何使用它

What does this mean in C# and how can I use it?

本文关键字:何使用 什么 意味着 这在      更新时间:2023-10-16

我在 IDA Pro 中查看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 值。

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

要修复您的标志检查,您可以写

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

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