在 C/C++ 中,按位运算如何作用于变量赋值中的表达式?

Posted

技术标签:

【中文标题】在 C/C++ 中,按位运算如何作用于变量赋值中的表达式?【英文标题】:How do bitwise operations work on expressions within variable assignments in C/C++? 【发布时间】:2021-06-18 19:04:04 【问题描述】:

我正在学习逆向工程,并且我正在尝试理解以下 sn-p:

var = strcmp("C:\\Windows\\System32\\svchost.exe", pe.szExeFile);
if (var)
  var = -(var < 0) | 1;
if (var)

  // additional code here

我想我了解这里发生的大部分事情,但我对这样做的目的感到困惑 var = -(var &lt; 0) | 1; 线。我只是对 C/C++ 非常熟悉,所以我很难理解这行代码的作用。

我知道它是按位的OR,但我不确定-(var &lt; 0) 是如何工作的。括号内的表达式是否被评估为 1 或 0,然后应用负数和 OR?它被评估为布尔值吗?如果是这样,| 如何处理布尔值?

或者我完全错过了这里的重点?

【问题讨论】:

在 C 中,&lt; 的结果是 int(0 或 1) 如果您计算出这些位(并假设二进制补码表示),那只是编写var = (var &lt; 0) ? -1 : 1 的另一种方式。它可能是一种合法的编译器优化(以避免分支),但它不是人们通常会为此编写的代码。 @M.M - 谢谢,我至少可以根据这些信息进行逻辑分析 @dxiv - 当我最初阅读它时,我认为可能使用了 C 三元语法 |而不是 ?,因为这是我能够以对我有意义的方式解析它的唯一方法,所以很高兴知道,谢谢! 这没有多大意义。你可以删除它和下面的if 测试。 【参考方案1】:

strcmp() 返回三个可能结果之一:

0 > 0

假设常见的二进制补码,在第一个if 之后,变量var 将是

-1 表示前“ 0 表示前“= 0” +1 表示前者 "> 0"

但是,只有当var 不为零时,才会采用第二个if

“神秘”的第一个if 没有任何作用,就您显示的来源而言。

【讨论】:

可能var的实际值用在了未显示的代码中。 @NateEldredge 这就是我写“你展示的源 […]”的原因。 在处理了几天之后,我的猜测是它被反编译了,第二个 if 是 strcmp 的实现来强制回答 -1/0/+1 而不是更一般的 ' strcmp 规范中的“负/零/正” @spakejaniel 这听起来很明智。但是,我看到的strcmp() 的一些实现并不关心。

以上是关于在 C/C++ 中,按位运算如何作用于变量赋值中的表达式?的主要内容,如果未能解决你的问题,请参考以下文章

常用数据运算符

C/C++编程知识:运算符丨按位运算符,知识点详解

数据运算

使用 .NET 中的 Interlocked 类实现按位运算

复合赋值运算符

如何使用按位运算获取整数的第N位?