Qt Creator + GDB + MingW - 按位与题
Qt Creator + GDB + MingW - Bitwise And question
我尝试评估按位与运算结果的评估方式。我在 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 时数据也没有转换为十六进制。
有人可以向我澄清一下情况吗?
最佳
汤姆
这些是定义的正确值:
#define BITMASK_CAN_JUMP 1 << 0 // 0b0001
#define BITMASK_CAN_WALK 1 << 1 // 0b0010
您可能至少想在 1 << 0
和 1 << 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
),如果您看到该值,可能存在显示错误。
我尝试评估按位与运算结果的评估方式。我在 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 时数据也没有转换为十六进制。 有人可以向我澄清一下情况吗?
最佳 汤姆
这些是定义的正确值:
#define BITMASK_CAN_JUMP 1 << 0 // 0b0001
#define BITMASK_CAN_WALK 1 << 1 // 0b0010
您可能至少想在 1 << 0
和 1 << 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
),如果您看到该值,可能存在显示错误。