Qt Creator + GDB + MingW-按位与问题

时间:2019-01-15 14:21:11

标签: c qt gdb mingw

我试图评估按位与运算结果的评估方式。我在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条件的值为true,因为该值的值为2。在我看来,调试器通过将0x0010视为十六进制值来正确运行,而程序本身进行了某种隐式转换,例如将数据后面的值转换为十六进制值。我不明白为什么在使用GDB时,数据为什么也不会转换成十六进制。 有人可以帮我弄清楚情况吗?

最佳 汤姆

1 个答案:

答案 0 :(得分:1)

这些是定义的正确值:

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

您可能至少想在1 << 01 << 1上加上括号,但这是另一回事了。无论如何,data变成0b10 | 0b01,即0b11或十进制的3

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

因此,将使用if (data & BITMASK_CAN_WALK),因为它不是0(在C ++中,它将被隐式转换为true),并打印上述2。如果将格式说明符更改为#010x,则会看到它确实是0x2

这里没有任何值0x0010(十进制16),如果看到该值,可能会显示错误。