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

标签 c# c++ reverse-engineering

<分区>

我在 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# 中,!运算符不能像这样应用于非 bool 类型 - 众所周知,这一事实会让 C 和 C++ 程序员感到惊讶。

要修复你的标志检查,你会写

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

由于运算符优先级,所有括号都是必需的。如果没有“中间”括号,“8 == 0”将在 & 之前计算并导致另一个编译器错误,“Operator & cannot be applied to int and bool”。

关于c# - 这在 C# 中意味着什么,我该如何使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43356015/

相关文章:

android - Google Play Billing Library 1.0 (2017) - 破解更容易吗?

c# - 无法将json解析成对象

c++ - 从文本文件中读取特定条目

c# - 组合框数据绑定(bind)

非 protobuf 类的 protobuf `oneof` 功能的 C++ 实现

c++ - 如何在 C++ 的 boost::regex_replace() 中插入格式 str 并且不删除输入字符串中匹配的正则表达式?

java - 任何人都可以使用任何 Java 应用程序的代码吗?

reverse-engineering - PDB 文件中不存在导出的别名符号(RegisterClipboardFormat 具有 RegisterWindowMessage 内部名称)

c# - 我们如何在最新的 mongodb c# 驱动程序中使用 CreateIndexModel 创建多个索引

c# - 流利的 NHibernate : mapping child collection with discriminator