[英]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=0x20
和r8=0xFFFFFFFF
指令之后,我们还有r8=0xFFFFFFFF
我对x86-64汇编的知识很差,但是该指令应该是无符号移位,所以为什么结果不是0呢?
我正在使用mingw-gcc x86-64 4.9.1
在编译器上调用-Wall
,将-Wshift-count-overflow
问题,因为您使用32进行移位,即unsigned int的大小。 现在,您只需要了解一件事就可以做一件事。 将32更改为31并进行编译。 然后比较生成的程序集,您将知道出了什么问题。
最简单的解决方法是对all1
和result
使用long
数据类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.