奇怪的位操作导致C /拆卸

Strange bit operation result in C++ / disassembly?

本文关键字:拆卸 位操作      更新时间:2023-10-16

在C 函数中,我有以下变量:

uint32_t buf = 229;  //Member variable
int bufSize = 0;     //Member variable
static constexpr const uint32_t all1 = ~((uint32_t)0);

和这条代码线:

uint32_t result = buf & (all1 >> (32-bufSize ));

result的值为229,无论是通过控制台输出还是通过GDB进行调试。预期值当然是0,任何使问题重现最小示例的试验失败了。

所以我去了拆卸并逐步执行它。位移动操作在这里:

0x44c89e  <+0x00b4>        41 d3 e8                 shr    %cl,%r8d

调试器寄存器显示在说明之前,rcx=0x20r8=0xFFFFFFFF

说明后,我们仍然有r8=0xFFFFFFFF

我对X86-64组件的了解非常糟糕,但是该指令应该是一个无签名的转变,那么为什么结果不是结果0呢?

我正在使用mingW-GCC x86-64 4.9.1

在编译器上调用 -Wall,并且在使用32用于换档时,您将遇到-Wshift-count-overflow问题,该换档大小是无符号int的大小。现在,您可以做一件事只是为了了解它。将32更改为31并编译。然后比较生成的组件,您将知道出了什么问题。

最简单的修复程序是将long数据类型用于all1result