繁体   English   中英

C ++ /反汇编中奇怪的位运算结果?

[英]Strange bit operation result in C++ / disassembly?

在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 ));

然后,通过控制台输出或通过gdb调试, result值为229。 期望值当然是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 ,将-Wshift-count-overflow问题,因为您使用32进行移位,即unsigned int的大小。 现在,您只需要了解一件事就可以做一件事。 将32更改为31并进行编译。 然后比较生成的程序集,您将知道出了什么问题。

最简单的解决方法是对all1result使用long数据类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM