奇怪的位操作导致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 ));
则result
的值为229,无论是通过控制台输出还是通过GDB进行调试。预期值当然是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
,并且在使用32用于换档时,您将遇到-Wshift-count-overflow
问题,该换档大小是无符号int的大小。现在,您可以做一件事只是为了了解它。将32更改为31并编译。然后比较生成的组件,您将知道出了什么问题。
最简单的修复程序是将long
数据类型用于all1
和result
。
相关文章:
- 对字符串进行位操作
- 对字符数组中的元素执行逐位操作
- 逐位操作的隐式类型转换
- 如何进行特定的位操作?
- C++避免位操作完全移位
- 使用双包装器类进行位操作(C++、clang)修复性能下降问题
- 使用位操作优化检查
- 子集相关位操作
- 使用 c++ 提升库的按位操作
- 位操作和异或
- 位操作将最左侧的设置位转换为右侧交替位?
- 为什么对小于 4 个字节的整数类型的位操作会发生意外行为?
- POD 类型的原子按位操作
- 如何使用位操作在单个整数中编码和解码两个数字
- __int128的位操作
- 使用位操作会影响内存消耗?
- 在具有位操作的函数中获得值
- C/C 位操作不会导致预期输出
- 在数组大小中使用位操作的原因
- 奇怪的位操作导致C /拆卸