0

我试图评估如何评估按位与运算结果。我在 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 时数据也没有转换为十六进制。有人可以向我澄清情况吗?

最好的汤姆

4

1 回答 1

1

这些是定义的正确值:

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

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

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

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

这里没有任何值0x001016十进制),如果您看到该值,可能存在显示错误。

于 2019-01-15T14:37:06.377 回答