【问题标题】:Qt Creator + GDB + MingW - Bitwise And questionQt Creator + GDB + MingW - 按位与问题
【发布时间】:2019-01-15 14:21:10
【问题描述】:

我试图评估如何评估按位与运算结果。我在 Windows 上使用 Qt Creator + GDB + MingW。

我做了一个简单的测试:

#define BITMASK_CAN_JUMP 1 << 0 // 0x0001
#define BITMASK_CAN_WALK 1 << 1 // 0x0010

unsigned int data = BITMASK_CAN_JUMP | BITMASK_CAN_WALK;
...
    if (data & BITMASK_CAN_WALK) {
        printf("%d", data & BITMASK_CAN_WALK);
        printf("can walk\n");
    }
...

在 GDB 中为 (data & 0x0010) 设置手表会得到值 0,因为 0x0010 = 0b10000 这是正确的。 if 条件评估为真,因为该值被评估为 2。对我来说,调试器似乎通过将 0x0010 视为十六进制值而正确运行,而程序本身进行了某种隐式转换,例如将数据后面的值转换为十六进制值。我不明白为什么在使用 GDB 时数据也没有转换为十六进制。 有人可以帮我澄清一下情况吗?

最好的 汤姆

【问题讨论】:

  • 在 GDB 中使用 0b0010 可以正常工作。
  • BITMASK_CAN_WALK 1 &lt;&lt; 1 不是 0x0010 就像评论所暗示的那样,它是 0x00020b0010
  • 是的,我是这个意思。位掩码在 GDB 中以某种方式显示为 0x0010。
  • 这就是为什么我问自己为什么定义似乎评估为 0x0010 以及在运行代码时会发生什么样的不可见转换。在我看来,数据和 0x0010(这是我从 IDE 中获得的用于定义的值)在 GDB 中的行为与实际程序不同。

标签: c qt gdb mingw


【解决方案1】:

这些是定义的正确值:

#define BITMASK_CAN_JUMP 1 << 0 // 0b0001
#define BITMASK_CAN_WALK 1 << 1 // 0b0010

您可能至少想在1 &lt;&lt; 01 &lt;&lt; 1 周围加上大括号,但那是另一回事了。不管怎样,data 变成了0b10 | 0b01,也就是0b11,或者十进制的3

(data &amp; BITMASK_CAN_WALK)0b11 &amp; 0b10,即0b10,或十进制的2

因此,if (data &amp; BITMASK_CAN_WALK) 被采用,因为它不是 0(在 C++ 中它会被隐式转换为 true),它会打印出前面提到的 2。如果您将格式说明符更改为#010x,您会发现它确实是0x2

这里没有值 0x0010(十进制的16),如果您看到该值,可能存在显示错误。

【讨论】:

  • 谢谢。这就是我的想法和我的理解。可能是预处理定义的显示问题。创建具有相同位掩码的 const 无符号整数会在 GDB 中显示正确的值。
猜你喜欢
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 2013-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
相关资源
最近更新 更多